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"); //换行
- }
- }
- }
-
-
- }
期待您的点评!
|