1. 首先感谢论坛网友提前指出了这个巨坑!
在原理图上,错误之处为:MCU的CAN_TX 连接到了 CAN收发器芯片的 CAN_RX, MCU的CAN_RX 连接到了 CAN收发器芯片的 CAN_TX,
正确的连接方法为:
MCU_CAN_TX <----> CAN_TX,
MCU_CAN_RX <----> CAN_RX,
说干就干,直接把电阻跳线对换,只有这个办法了!
打开历程,默认是250k,参数稍微改一下,改成500k。
把接收发送历程融合在一起,哈哈,成功了!
main.c 如下:
CanTxMsg CAN_TX_Config ={TX_CANID,CAN_ID_STD,CAN_DATA_FRAME,8,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
CanPeliRxMsg CanPeliRxMsgStructure;
u8 user_can_mode = 0;
int main(void)
{
int keycnt = 0;
delay_init();
delay_ms(3000);
LED_Init();
KEY_Init();
uart_initwBaudRate(115200);
printf("CAN (500k) demo with mask id is 0x172,0x236!\r\n");
CANM_Init();
//只可接收验收代码寄存器中的两个CAN_ID的帧
CAN_Config(CAN_500K,StandardFrame_DoubleFilter,0x172,0x236,0xff,0xff);
while(1)
{
if(KEY4 == 0)
{
delay_ms(30);
while(KEY4 == 0);
keycnt++;
if(keycnt%2)
{
LED2_ON();
LED4_OFF();
user_can_mode = 1; // r
}
else
{
LED2_OFF();
LED4_ON();
user_can_mode = 0; // s
}
}
if(user_can_mode)
{
Send_CANFrame(&CAN_TX_Config); //发送一帧CAN数据
printf("CAN send data OK!\r\n"); //串口打印
delay_ms(300);
}
else
{
if(flag)
{
flag = 0;
LED4_TOGGLE();
printf("CANID:0x%x Data:",CanPeliRxMsgStructure.ID); //串口打印
for(int i = 0; i < 8; i++)
{
printf("%02x ",CanPeliRxMsgStructure.Data[i]); //打印CAN报文内容
}
printf("\r\n"); //换行
}
}
}
}
期待您的点评!
|