在线时间2 小时
UID3137287
注册时间2015-7-5
NXP金币0
该用户从未签到
新手上路

- 积分
- 26
- 最后登录
- 2015-10-26
|
#include <mqx.h>
#include <bsp.h>
#include <lwevent.h>
#include "test.h"
#include "lwevent.h"
#ifndef PSP_MQX_CPU_IS_KINETIS
#include <flexcan.h>
#endif
LWEVENT_STRUCT event;
TASK_TEMPLATE_STRUCT MQX_template_list[] = {
{ MAIN_TASK, Main_Task, 1000L, 9, "Main task", MQX_AUTO_START_TASK},
{ TX_TASK, Tx_Task, 1000L, 8, "TX task", 0, 0, 0},
{ RX_TASK, Rx_Task, 1000L, 8, "RX task", 0, 0, 0},
{ 0L, 0L, 0L, 0L, 0L, 0L }
};
void MY_FLEXCAN_ISR
(
/* [IN] FlexCAN base address */
pointer can_ptr
)
{
volatile CAN_MemMapPtr can_reg_ptr;
vuint_32 tmp_reg;
vuint_32 temp;
uint32_t error;
can_reg_ptr = (CAN_MemMapPtr)can_ptr;
/* get the interrupt flag */
tmp_reg = (can_reg_ptr->IFLAG1 & CAN_IMASK1_BUFLM_MASK);
// check Tx/Rx interrupt flag and clear the interrupt
if(tmp_reg){
/* clear the interrupt and unlock message buffer */
/* Start CR# 1751 */
error=_lwevent_set(&event, tmp_reg);
can_reg_ptr->IFLAG1 |= tmp_reg;
/* End CR# 1751 */
temp = can_reg_ptr->TIMER;
}/* Endif */
// Clear all other interrupts in ERRSTAT register (Error, Busoff, Wakeup)
tmp_reg = can_reg_ptr->ESR1;
if(tmp_reg & FLEXCAN_ALL_INT){
/* Start CR# 1751 */
can_reg_ptr->ESR1 |= (tmp_reg & FLEXCAN_ALL_INT);
/* End CR# 1751 */
} /* Endif */
return;
}
void Main_Task(uint_32 parameter)
{
_int_install_unexpected_isr();
_bsp_flexcan_io_init(CAN_DEVICE);
frequency = 125; //selected frequency
data_len_code = 8; //Data length
format = FLEXCAN_STANDARD; //Select message format
/* Select mailbox number */
RX_mailbox_num = 1;
TX_mailbox_num = 1;
RX_identifier = 0x122;
TX_identifier = 0x122;
bit_timing0 = bit_timing1 = 0; /* We use default settings */
flexcan_mode = FLEXCAN_LOOPBK_MODE; /* Select operation mode:FLEXCAN_LOOPBK_MODE | FLEXCAN_NORMAL_MODE*/
interrupt = FLEXCAN_ENABLE; /* Enable interrupt */
flexcan_error_interrupt = 1; /* Enable error interrupt */
FLEXCAN_Softreset ( CAN_DEVICE); /* Reset FLEXCAN device */
FLEXCAN_Initialize ( CAN_DEVICE, bit_timing0, bit_timing1, frequency, FLEXCAN_IPBUS_CLK);/* Initialize FLEXCAN device */
FLEXCAN_Select_mode( CAN_DEVICE, flexcan_mode);/* Select mode */
FLEXCAN_Set_global_stdmask (CAN_DEVICE, 0x222 );
if(flexcan_error_interrupt == 1)/* Enable error interrupts */
{
FLEXCAN_Install_isr_err_int(CAN_DEVICE, MY_FLEXCAN_ISR );
FLEXCAN_Install_isr_boff_int(CAN_DEVICE, MY_FLEXCAN_ISR );
FLEXCAN_Error_int_enable(CAN_DEVICE);
}
_lwevent_create(&event, LWEVENT_AUTO_CLEAR); /* Set up an event group */
_task_create(0, RX_TASK, 0);
_task_create(0, TX_TASK, 0);
FLEXCAN_Start(CAN_DEVICE);/* Start FLEXCAN */
while(1){}
}
void Tx_Task(uint_32 parameter)
{
uchar data[]= {0X41,0x42,0x43,0x44,0x45,0x46,0x47,0x48};
uint_32 result;
uchar string[] = {0xa, 0xb, 0xe, 0xc, 0xe, 0xd, 0xa, 0x0};
FLEXCAN_Initialize_mailbox( CAN_DEVICE, TX_mailbox_num, TX_identifier,data_len_code, FLEXCAN_TX, format,interrupt);/* Initialize mailbox */
FLEXCAN_Activate_mailbox(CAN_DEVICE, TX_mailbox_num, FLEXCAN_TX_MSG_BUFFER_NOT_ACTIVE);
if(interrupt == FLEXCAN_ENABLE)
{
FLEXCAN_Install_isr( CAN_DEVICE, TX_mailbox_num, MY_FLEXCAN_ISR );
}
_time_delay(1000);
while(1)
{
result = FLEXCAN_Tx_message(CAN_DEVICE, TX_mailbox_num, TX_identifier, format, data_len_code, &data[0]);
// result = FLEXCAN_Tx_mailbox(CAN_DEVICE, TX_mailbox_num, &data[0]);
if(result != FLEXCAN_OK)
printf("\nTransmit error. Error Code: 0x%lx", result);
else
printf("\nTX Data: ");
for (result = 0; result <8; result++) printf ("0x%X ", data[result]);
_time_delay(1000);
}
}
void Rx_Task(uint_32 parameter)
{
uchar dptr[8];
uint_32 result;
uint_32 DLC = 0;
uint_32 ID = 0;
FLEXCAN_Initialize_mailbox( CAN_DEVICE, RX_mailbox_num, RX_identifier,data_len_code, FLEXCAN_RX, format,interrupt);
FLEXCAN_Activate_mailbox(CAN_DEVICE, RX_mailbox_num, FLEXCAN_RX_MSG_BUFFER_EMPTY);
if(interrupt == FLEXCAN_ENABLE)
{
FLEXCAN_Install_isr( CAN_DEVICE, RX_mailbox_num, MY_FLEXCAN_ISR );
}
while(1)
{
if (_lwevent_wait_ticks(&event, 1 << RX_mailbox_num, FALSE, 0) != MQX_OK) {
printf("\nEvent Wait failed");
}
result = FLEXCAN_Unlock_mailbox (CAN_DEVICE);
if(result != FLEXCAN_OK)
{
printf("\nUnlock mailbox failed. Error Code: 0x%lx", result);
}
result = FLEXCAN_Rx_message(CAN_DEVICE, RX_mailbox_num, &ID, format,&DLC, &dptr, interrupt);
if(result != FLEXCAN_OK)
printf("\nReceived error. Error Code: 0x%lx", result);
else
{
printf("\nRX data: ");
for (result = 0; result < DLC; result++) printf ("0x%X ", dptr[result]);
printf("\nID is: 0x%X", ID);
printf("\nDLC is: 0x%X\n", DLC);
}
result = FLEXCAN_Unlock_mailbox (CAN_DEVICE);
if(result != FLEXCAN_OK)
{
printf("\nUnlock mailbox failed. Error Code: 0x%lx", result);
}
//FLEXCAN_Request_message (CAN_DEVICE, RX_mailbox_num, format);
}
}
|
-
串口打印信息
|