在线时间40 小时
UID3082635
注册时间2014-12-11
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 268
- 最后登录
- 2015-8-25
|
最近调试设计的板子CAN通信部分,能够与SABRELITE进行数据传输。但是当我连到到要进行真正传输的板子是时是不通的。求大神...
以下是该板子的CAN 通信:
typedef struct
{
volatile uint32 ID; // CAN Message ID (11-bit or 29-bit)
volatile uint32 data_A; // CAN Message Data Bytes 0-3
volatile uint32 data_B; // CAN Message Data Bytes 4-7
} CAN_Message;
CAN_Message CAN_Data_TX, CAN_Data_RX; // TX and RX Buffers for CAN message
接收部分:
void CAN_IRQHandler(void)
{
volatile auto uint32 can_icr;
can_icr = LPC_CAN1->ICR; //CAN1读取中断标志,并清除标志
if(Bit_check_1(can_icr,ICR_RI)) //CAN1有接收中断
{
if(((LPC_CAN1->RFS>>16)&0x0F)==0x08&&((LPC_CAN1->RFS>>30)&0x03)==0)//数据长度为8位,接收数据,报文地址11位,数据正确
{
if(Bit_check_0(CAN_Data_Receive_Flag,RECEIVE_OK))//可跟新数据
{
CAN_Data_RX.ID = LPC_CAN1->RID;
CAN_Data_RX.data_A = LPC_CAN1->RDA;
CAN_Data_RX.data_B = LPC_CAN1->RDB;
Bit_set(CAN_Data_Receive_Flag,RECEIVE_OK);//设置接收成功标志
}
LPC_CAN1->CMR = 0x04; //清空接收缓存
}
}
}
发送部分:
Send_CAN_Data(&CAN_Data_TX.data_A,&CAN_Data_TX.data_B);
void Send_Set_Ventilator_Assisted(volatile uint32 *data_a,volatile uint32 *data_b)
{
*data_a=(((uint32)Set_parameter.Flowmeter_FiO2)<<24)|(((uint32)Set_parameter.Flowmeter_Flow)<<8)|((uint32)Set_parameter.Anesthetic_Compensation);
*data_b=(((uint32)Set_parameter.TV_Plus)<<24)|(((uint32)Set_parameter.Gas_O2_Concentration)<<16)|(((uint32)Set_parameter.Gas_N2O_Compensation)<<8);
}
CAN_Send_Message(LPC_CAN1,&CAN_Data_TX);
uint8 CAN_Send_Message(LPC_CAN_TypeDef *can,CAN_Message *tx_buf )
{
auto uint8 return_data=0;
if (Bit_check_1(can->SR,SR_TBS1))//检测状态寄存器缓冲1是否可用
{
can->TFI1 = 0x00080000;//发送无优先级,固定字节为8,发送数据,11位ID
can->TID1 = tx_buf->ID;
can->TDA1 = tx_buf->data_A;
can->TDB1 = tx_buf->data_B;
can->CMR = 0x21;//信息已载入可以发送缓冲器1的数据
return_data=1;
}
else if (Bit_check_1(can->SR,SR_TBS2))//检测状态寄存器缓冲2是否可用
{
can->TFI2 = 0x00080000;//发送无优先级,固定字节为8,发送数据,11位ID
can->TID2 = tx_buf->ID;
can->TDA2 = tx_buf->data_A;
can->TDB2 = tx_buf->data_B;
can->CMR = 0x41;//信息已载入可以发送缓冲器2的数据
return_data=1;
}
else if (Bit_check_1(can->SR,SR_TBS3))//检测状态寄存器缓冲3是否可用
{
can->TFI3 = 0x00080000;//发送无优先级,固定字节为8,发送数据,11位ID
can->TID3 = tx_buf->ID;
can->TDA3 = tx_buf->data_A;
can->TDB3 = tx_buf->data_B;
can->CMR = 0x81;//信息已载入可以发送缓冲器2的数据
return_data=1;
}
else
return_data=0;
return (return_data);
}
|
|