STM32F103C8T6调试CAN通讯
这是我这两天做的一个功能,有一些细节没注意,导致移植没通,现在记下来。
一、硬件部分
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通讯相关推荐
- modbus串口调试助手 MODBUS调试 智能仪表通讯必备软件 RS485串口通讯
modbus串口调试助手 MODBUS调试 智能仪表通讯必备软件 RS485串口通讯 自动生成CRC校验码 3个发送区 学习串口调试必备软件id=653678441225&
- 野火多功能调试助手】-摄像头调试助手通讯协议
野火多功能调试助手] [复制链接] 摄像头调试助手通讯协议 LONG_R3acc 电梯直达 1# 发表于 2020-6-8 14:49:48 | 只看该作者 ] 本帖最后由 LONG_R3 ...
- UART接口算法移植加密芯片的调试技巧——通讯调试
算法移植类加密芯片是凌科芯安公司的专利产品,主要功能是芯片内部嵌入凌科芯安公司的LKCOS智能操作系统,用户可以把MCU中程序一部分关键算法函数移植到芯片中运行.用户采用标准C语言编写代码,通过KEI ...
- stm32f103c8t6调试-while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET );卡死
最近使用stm32f103c8t6自带的ADC,遇到如下问题:while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET ); 程序执行到这里跳不出循环 ...
- STM32F103C8T6实现CAN通讯与直流编码电机转速闭环控制
本次实验目的是通过CAN发送目标转速与转向信息,接收方在接到CAN数据流后开始对直流编码电机进行转速闭环控制.我会尽量说清每个函数,注释每一句代码,希望能对大家有所帮助. CAN通讯基于STM32自带 ...
- 查看PLC IP 端口_西门子828D数控系统X130接口通讯怪异现象(X130手动设置的 IP)...
西门子828D数控系统,调试PLC过程中遇到网络通信怪异问题(不能直连非要加个路由器),笔记本电脑的以太网网络直接连接显示网络电缆被拔出,如下图所示: 奇怪,怎么出现这种情况了呢,因为我用这台电脑调试 ...
- kgdb调试内核无法执行断点及kdb-22:Permisson denied
之前在Centos8操作系统中,通过kgdb调试内核遇到无法执行断点及kdb-22:Permisson denied的问题.接下来,通过本篇文章讲述修改的配置参数. 章节预览: 1. 选择内核配置内核 ...
- 单片机串口通信电平不匹配的解决电路,5V 3.3V串口通讯
很早的时候调试串口通讯遇到单片机和模块电压不匹配,信号无法传输,所以整理后来遇到的转换电路. 1.最简单的用转换电平IC,可以去淘宝上搜索,有四路的有两路的,比如这个双向电平转换模块 2.根据接触的开 ...
- Modbus调试软件--ModbusPoll、ModbusSlave使用详解
软件下载链接: 链接: https://pan.baidu.com/s/1vQiGP-AIYxShcZhbxbctTg 提取码: dqeg Modbus基础知识讲解: 详解Modbus通信协议-清晰易 ...
最新文章
- python自学流程-各个阶段的python学习路线?
- JUnit单元测试用例
- 代理模式——静态代理,动态代理(JDK代理和CGLib代理)
- IE7不能显示PNG
- 深入理解python特性_深入理解Python特性(7)
- wxWidgets:wxVariantDataSafeArray类用法
- 别去取悦,心里没你的人
- C++中全局变量的使用
- Maven系列(一):maven基础入门
- 新冠隔离让你家Wifi变慢?全球网络大塞车AI缓拥堵,边缘计算或成杀手锏
- JAVA8内存最多设置多少,堆内存居高不下,JDK8自适应作怪
- 百病皆由痰作祟~一碗神奇的水?(生姜红糖水、姜糖水、中医)
- Linear-gradient()
- 在网页前端调用exe程序并传参
- (转) 两天快速开发一个自己的微信小程序
- CSDN蓝桥杯算法题——题解Java版本——切面条
- mysql 测试数据库employees导入
- 改变xp开机和关机画面的方法
- 解决Windows缺少MSCOMCTL.OCX文件无法运行程序问题
- 微服务网关:SpringCloud Gateway保姆级入门教程