[技术相关] 华芯SWM341的CAN程序代码

[复制链接]
 楼主| AdaMaYun 发表于 2023-8-22 14:00 | 显示全部楼层 |阅读模式
  1. #include "SWM341.h"

  2. CAN_RXMessage CAN_RXMsg;

  3. void SerialInit(void);

  4. int main(void)
  5. {
  6.         uint32_t i;
  7.         uint8_t tx_data[8] = {1, 2, 3, 4, 5, 6, 7, 8};
  8.         CAN_InitStructure CAN_initStruct;
  9.        
  10.         SystemInit();
  11.        
  12.         SerialInit();
  13.        
  14.         PORT_Init(PORTB, PIN5, PORTB_PIN5_CAN0_RX, 1);        //GPIOB.5配置为CAN0输入引脚
  15.         PORT_Init(PORTB, PIN4, PORTB_PIN4_CAN0_TX, 0);        //GPIOB.4配置为CAN0输出引脚
  16.        
  17.         CAN_initStruct.Mode = CAN_MODE_SELFTEST;        //自测模式下TX、RX要连接在一起
  18.         CAN_initStruct.CAN_bs1 = CAN_BS1_5tq;
  19.         CAN_initStruct.CAN_bs2 = CAN_BS2_4tq;
  20.         CAN_initStruct.CAN_sjw = CAN_SJW_2tq;
  21.         CAN_initStruct.Baudrate = 50000;
  22.         CAN_initStruct.RXNotEmptyIEn = 0;
  23.         CAN_initStruct.ArbitrLostIEn = 0;
  24.         CAN_initStruct.ErrPassiveIEn = 0;
  25.         CAN_Init(CAN0, &CAN_initStruct);
  26.        
  27.         CAN_SetFilter32b(CAN0, CAN_FILTER_1, 0x00122122, 0x1FFFFFFE);                //接收ID为0x00122122、0x00122123的扩展包
  28.         CAN_SetFilter16b(CAN0, CAN_FILTER_2, 0x122, 0x7FE, 0x101, 0x7FF);        //接收ID为0x122、123、0x101的标准包
  29.        
  30.         CAN_Open(CAN0);
  31.        
  32.         CAN_Transmit(CAN0, CAN_FRAME_STD, 0x122, tx_data, 8, 1);
  33.         while(CAN_TXComplete(CAN0) == 0) __NOP();
  34.        
  35.         CAN_Transmit(CAN0, CAN_FRAME_EXT, 0x122122, tx_data, 8, 1);
  36.         while(CAN_TXComplete(CAN0) == 0) __NOP();
  37.        
  38.         while(CAN_RXDataAvailable(CAN0))
  39.         {
  40.                 CAN_Receive(CAN0, &CAN_RXMsg);
  41.                
  42.                 printf("\r\nReceive %s %08X: ", CAN_RXMsg.format == CAN_FRAME_STD ? "STD" : "EXT", CAN_RXMsg.id);
  43.                 for(i = 0; i < CAN_RXMsg.size; i++) printf("%02X, ", CAN_RXMsg.data[i]);
  44.         }
  45.        
  46.         while(1==1)
  47.         {
  48.         }
  49. }


  50. void SerialInit(void)
  51. {
  52.         UART_InitStructure UART_initStruct;
  53.        
  54.         PORT_Init(PORTM, PIN0, PORTM_PIN0_UART0_RX, 1);                //GPIOM.0配置为UART0输入引脚
  55.         PORT_Init(PORTM, PIN1, PORTM_PIN1_UART0_TX, 0);                //GPIOM.1配置为UART0输出引脚
  56.        
  57.         UART_initStruct.Baudrate = 57600;
  58.         UART_initStruct.DataBits = UART_DATA_8BIT;
  59.         UART_initStruct.Parity = UART_PARITY_NONE;
  60.         UART_initStruct.StopBits = UART_STOP_1BIT;
  61.         UART_initStruct.RXThresholdIEn = 0;
  62.         UART_initStruct.TXThresholdIEn = 0;
  63.         UART_initStruct.TimeoutIEn = 0;
  64.         UART_Init(UART0, &UART_initStruct);
  65.         UART_Open(UART0);
  66. }

  67. /******************************************************************************************************************************************
  68. * 函数名称: fputc()
  69. * 功能说明: printf()使用此函数完成实际的串口打印动作
  70. * 输    入: int ch                要打印的字符
  71. *                        FILE *f                文件句柄
  72. * 输    出: 无
  73. * 注意事项: 无
  74. ******************************************************************************************************************************************/
  75. int fputc(int ch, FILE *f)
  76. {
  77.         UART_WriteByte(UART0, ch);
  78.        
  79.         while(UART_IsTXBusy(UART0));
  80.        
  81.         return ch;
  82. }


jiahy 发表于 2023-8-22 20:58 | 显示全部楼层
这个一般用在什么地方
tpgf 发表于 2023-9-7 11:55 | 显示全部楼层
这个can使用的是回环模式的吗
八层楼 发表于 2023-9-7 13:02 | 显示全部楼层
真的需要和另一方通讯的话 硬件的连接上需要注意什么呢
guanjiaer 发表于 2023-9-7 13:52 | 显示全部楼层
为什么自己测试的时候没有问题 实际连接的时候就通讯不上呢
heimaojingzhang 发表于 2023-9-7 21:41 | 显示全部楼层
两个can设备通讯,需要连接地线吗?
观海 发表于 2023-9-7 22:09 | 显示全部楼层
有相关标志位能确定当前接收完成了吗
晓伍 发表于 2023-9-7 22:39 | 显示全部楼层
在这种测试方式下,信号能使用示波器进行采集吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

299

主题

2492

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部

299

主题

2492

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部