这是我这两天做的一个功能,有一些细节没注意,导致移植没通,现在记下来。

一、硬件部分

STM32F103C8T6 :2个,记为STM32(1),STM32(2)

TJA1050(CAN模块):2个,记为TJA(1),TJA(2)

STM32(1)的RX接TJA(1)的RX,TX接TX。TJA(1)的CAN_H接另一个TJA(2)的CAN_H,CAN_L接CAN_L。然后TJA(2)的RX接STM32(2)的RX,TX接TX。

二、软件部分

注释:软件参考了网上的一些朋友的代码,如果雷同,纯属参考学习,谢谢!

u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{GPIO_InitTypeDef        GPIO_InitStructure; CAN_InitTypeDef            CAN_InitStructure;CAN_FilterInitTypeDef     CAN_FilterInitStructure;
#if CAN1_RX0_INT_ENABLE NVIC_InitTypeDef  NVIC_InitStructure;
#endifRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                                                              RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);   GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHzGPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHzGPIO_Init(GPIOA, &GPIO_InitStructure);CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;CAN_InitStructure.CAN_NART=DISABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;CAN_InitStructure.CAN_SJW=tsjw;  CAN_InitStructure.CAN_BS1=tbs1; CAN_InitStructure.CAN_BS2=tbs2;CAN_InitStructure.CAN_Prescaler=brp;CAN_Init(CAN1, &CAN_InitStructure);CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);#if CAN1_RX0_INT_ENABLECAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);CAN_ITConfig(CAN1,CAN_IT_BOF,ENABLE);NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
#endifreturn 0;
}
#if CAN1_RX0_INT_ENABLE
void USB_LP_CAN1_RX0_IRQHandler(void)
{int i=0;CanRxMsg RxMessage;RxMessage.StdId=0x00;  RxMessage.ExtId=0x00;  RxMessage.IDE=0;        RxMessage.RTR=0;     RxMessage.FMI=0;for(i=0;i<8;i++)RxMessage.Data[i]=0;CAN_Receive(CAN1, 0, &RxMessage);//USART1_DATA(RxMessage.Data,RxMessage.DLC);printf("IRQ RxMessage.Data = %s\r\n", RxMessage.Data);
}
#endif
u8 CAN1_Send_Msg(u8* msg,u8 len)
{   u8 mbox;u16 i=0;CanTxMsg TxMessage;TxMessage.StdId=0x12;   TxMessage.ExtId=0x12; TxMessage.IDE=CAN_ID_STD;       TxMessage.RTR=CAN_RTR_Data;       TxMessage.DLC=len;                     for(i=0;i<len;i++)TxMessage.Data[i]=*(msg+i);                mbox= CAN_Transmit(CAN1, &TxMessage); i=0;while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; /if(i>=0XFFF)return 1;return 0;     }
int main(void)
{           u8 i,cnt,len,res;u8 canbuf[8];NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init();CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,0);printf("stm32 startup!\r\n");while(1){#if 1delay_ms(1000);len = 8;cnt = 'a';for(i=0;i<len;i++){canbuf[i]=cnt+i;}res = CAN1_Send_Msg(canbuf, len);#endif}
}

两个STM32都烧写这个程序,然后接上串口,每隔1s会收到另一个STM32发来的8个字节的abcdefgh。

注意事项:

1、TJA1050供电5V

2、用printf打印数据,如果用USART_SendData必须等待发送完成再发送下一个字符。循环打印可以参考如下:

void USART1_DATA(unsigned char *lb,unsigned int len)
{unsigned int i;for(i=0;i<len;i++){USART_SendData(USART1,*lb);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}lb ++;}
}

3、CAN_TX和CAN_RX的GPIO属性配置不一样,要注意一下。

4、CAN1_RX0_INT_ENABLE置为1

STM32F103C8T6调试CAN通讯相关推荐

  1. modbus串口调试助手 MODBUS调试 智能仪表通讯必备软件 RS485串口通讯

    modbus串口调试助手 MODBUS调试 智能仪表通讯必备软件 RS485串口通讯 自动生成CRC校验码 3个发送区 学习串口调试必备软件id=653678441225&

  2. 野火多功能调试助手】-摄像头调试助手通讯协议

    野火多功能调试助手] [复制链接] 摄像头调试助手通讯协议     LONG_R3acc 电梯直达 1#  发表于 2020-6-8 14:49:48 | 只看该作者  ] 本帖最后由 LONG_R3 ...

  3. UART接口算法移植加密芯片的调试技巧——通讯调试

    算法移植类加密芯片是凌科芯安公司的专利产品,主要功能是芯片内部嵌入凌科芯安公司的LKCOS智能操作系统,用户可以把MCU中程序一部分关键算法函数移植到芯片中运行.用户采用标准C语言编写代码,通过KEI ...

  4. stm32f103c8t6调试-while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET );卡死

    最近使用stm32f103c8t6自带的ADC,遇到如下问题:while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET ); 程序执行到这里跳不出循环 ...

  5. STM32F103C8T6实现CAN通讯与直流编码电机转速闭环控制

    本次实验目的是通过CAN发送目标转速与转向信息,接收方在接到CAN数据流后开始对直流编码电机进行转速闭环控制.我会尽量说清每个函数,注释每一句代码,希望能对大家有所帮助. CAN通讯基于STM32自带 ...

  6. 查看PLC IP 端口_西门子828D数控系统X130接口通讯怪异现象(X130手动设置的 IP)...

    西门子828D数控系统,调试PLC过程中遇到网络通信怪异问题(不能直连非要加个路由器),笔记本电脑的以太网网络直接连接显示网络电缆被拔出,如下图所示: 奇怪,怎么出现这种情况了呢,因为我用这台电脑调试 ...

  7. kgdb调试内核无法执行断点及kdb-22:Permisson denied

    之前在Centos8操作系统中,通过kgdb调试内核遇到无法执行断点及kdb-22:Permisson denied的问题.接下来,通过本篇文章讲述修改的配置参数. 章节预览: 1. 选择内核配置内核 ...

  8. 单片机串口通信电平不匹配的解决电路,5V 3.3V串口通讯

    很早的时候调试串口通讯遇到单片机和模块电压不匹配,信号无法传输,所以整理后来遇到的转换电路. 1.最简单的用转换电平IC,可以去淘宝上搜索,有四路的有两路的,比如这个双向电平转换模块 2.根据接触的开 ...

  9. Modbus调试软件--ModbusPoll、ModbusSlave使用详解

    软件下载链接: 链接: https://pan.baidu.com/s/1vQiGP-AIYxShcZhbxbctTg 提取码: dqeg Modbus基础知识讲解: 详解Modbus通信协议-清晰易 ...

最新文章

  1. python自学流程-各个阶段的python学习路线?
  2. JUnit单元测试用例
  3. 代理模式——静态代理,动态代理(JDK代理和CGLib代理)
  4. IE7不能显示PNG
  5. 深入理解python特性_深入理解Python特性(7)
  6. wxWidgets:wxVariantDataSafeArray类用法
  7. 别去取悦,心里没你的人
  8. C++中全局变量的使用
  9. Maven系列(一):maven基础入门
  10. 新冠隔离让你家Wifi变慢?全球网络大塞车AI缓拥堵,边缘计算或成杀手锏
  11. JAVA8内存最多设置多少,堆内存居高不下,JDK8自适应作怪
  12. 百病皆由痰作祟~一碗神奇的水?(生姜红糖水、姜糖水、中医)
  13. Linear-gradient()
  14. 在网页前端调用exe程序并传参
  15. (转) 两天快速开发一个自己的微信小程序
  16. CSDN蓝桥杯算法题——题解Java版本——切面条
  17. mysql 测试数据库employees导入
  18. 改变xp开机和关机画面的方法
  19. 解决Windows缺少MSCOMCTL.OCX文件无法运行程序问题
  20. 微服务网关:SpringCloud Gateway保姆级入门教程

热门文章

  1. 数据可视化--世界幸福指数报告
  2. 上市公司退市的条件是什么
  3. C#依赖注入常用的几种方式
  4. mysql中having_mysql中having的用法(及和where的区别)
  5. ZOJ 3885 The Exchange of Items
  6. 【LeetCode击败99%+】二叉树的最大深度
  7. 基于MATLAB的COST231-WI模型的理论与仿真分析
  8. C#中的ManagementClass类
  9. 浅谈execl函数的使用
  10. Android开发北漂 8 年,飘飘飘 飘够了。,android移动开发基础案例教程