完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
研究STM32的双can有段时间了 一直有个问题一直没搞定,我初始化设置成500K,当 can总线上为500K时程序不会自动配置成相同的波特率.当总线上为125K是就会自动配置成125K 请大神们看看要怎么弄,
以下是我的部分代码: #include "stm32f10x.h" #include "led.h" #include "delay.h" #include "sys.h" #include "can.h" int main(void) { Bsp_Init(); while(1) { c1Sendc2Data(); c2Sendc1Data(); if (CAN_MessagePending(CAN1,CAN_FIFO0)==0) 检测有没有报文 没有就配置成125K { CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_16tq,CAN_BS2_1tq,8,CAN_Mode_Normal); Delay(1); } IWDG_ReloadCounter(); } } void Bsp_Init(void) { Delay_Init(); Delay(3); //ÑÓʱ3Ãë µÈ´ýµçÔ´ÉϵçÎȶ¨ºó µ¥Æ¬»úÔÙÕý³£¹¤×÷¡£ LED_Init(); BEEP_Init(); KEY_Init(); SFQpw=1; LED=1; BEEP=1; SFQout=1; SFQin=1; // USART_Configuration(); CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_16tq,CAN_BS2_1tq,4,CAN_Mode_Normal); 这里初始化设置can波特率设为500K // NVIC_Configuration(); // CAN_Filter_config(); // IWDG ... IWDG_Configuration(); } |
|
相关推荐
8个回答
|
|
没有用过can,不懂帮顶!
|
|
|
|
设置什么就是什么吧,这个CAN比特率还会可以自动?
|
|
|
|
你把 配置成125K的代码改为 500K 不行吗?
|
|
|
|
没弄过。不明觉厉。
|
|
|
|
|
|
配置成多大的,这个要靠CAN初始化的这几个参数计算的。125k这个是算出来的,这个你不懂的话,去看正点原子怎么教你计算的。
如果检测不到,报文然后配置成125k。这个完全是由程序控制啊。 |
|
|
|
贴上源程序:
GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; // CAN_FilterInitTypeDef CAN_FilterInitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 打开GPIO时钟、AFIO时钟,CAN时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* CAN1 RX PB8 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* CAN1 TX PB9 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //使用PA8 9引脚的第二功能 GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE); // CAN1 remap /* CAN1 Enabling interrupt */ NVIC_InitStructure.NVIC_IRQChannel=CAN1_RX0_IRQn; //STM32有2个3级深度的接收缓冲区:FIFO0和FIFO1 //如果是来自FIFO0的接收中断,则用CAN1_RX0_IRQn中断来处理。 //与这个 对应 CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); // 启动 CAN1_RX0_IRQn NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* CAN BaudRate = RCC_APB1PeriphClock/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler */ CAN_DeInit(CAN1); CAN_StructInit(&CAN_InitStructure); CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=ENABLE;//ABOM 自动离线管理 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_Mode=CAN_Mode_LoopBack; // #define SET_CAN_SJW CAN_SJW_1tq //#define SET_CAN_BS1 CAN_BS1_4tq // 8 //#define SET_CAN_BS2 CAN_BS2_4tq // 7 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_4tq; CAN_InitStructure.CAN_BS2=CAN_BS2_4tq; //#define SET_CAN_PRES 8 // 波特率分频器 9-250K 18-125K //CAN_InitStructure.CAN_Prescaler=pres; //CAN波特率 BaudRate = 36MHz/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler //CAN波特率 BaudRate = 4MHz/CAN_Prescaler switch(BRtXK)//通信速度:1000K,500K,250K,125K,100K,50K,20K,10K,5K_//11C14:10K_5K不行,1768_5K不行 { //uQuantumPrescaler为 6bit 所以应该<63 case 1000: CAN_InitStructure.CAN_Prescaler=4; //4000K/4 break; case 500: CAN_InitStructure.CAN_Prescaler=8; //4000k/8 break; case 250: CAN_InitStructure.CAN_Prescaler=16; //4000k/16 break; case 125: CAN_InitStructure.CAN_Prescaler=32; //4000k/32 break; case 100: CAN_InitStructure.CAN_Prescaler=40; //4000k/40 break; case 50: CAN_InitStructure.CAN_Prescaler=80; //4000k/80 break; case 20: CAN_InitStructure.CAN_Prescaler=200; //4000k/200 break; case 10: CAN_InitStructure.CAN_Prescaler=400; //4000k/400 break; case 5: CAN_InitStructure.CAN_Prescaler=800; //4000k/800 break; // uQuantumPrescaler=80; //1768无 CANBAUD_25k // uQuantumPrescaler=800; //1768无 CANBAUD_2k5 } CAN_Init(CAN1,&CAN_InitStructure); // CAN1 CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); // 启动 CAN1_RX0_IRQn 冗余双CAN现场总线STM32F105开发板KeilC++源程序 http://www.stmcu.org/module/forum/thread-612916-1-1.html |
|
|
|
看来你还没有弄懂CAN波特率是怎么计算出来的:
1> 首先你得知道的所使用到的CAN控制器外设挂载的APB总线频率多少?APB1/APB2?多少M?? 30M? 2> CAN预分频系数,即CAN_Prescaler值多少?假如是4,那么到CAN控制器外设的实际时钟频率则为30M/4=7.5M=7500 000bps 3> 再看CAN_BS1,CAN_BS2参数,假如BS1=6,BS2=8,那么CAN最终的波特率为7.5M/(6+8+1)=7500000/15=500000bps=500Kbps 就是这么来的 楼主代码参数BS1=16,BS2=1,SJW=1,但是实际到达CAN控制的时钟频率多少并不知道,。。因此我也无法判断你是否设置正确。SJW一般固定为1。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1301 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
805 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1188 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1660 浏览 1 评论
544 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 22:08 , Processed in 0.797231 second(s), Total 87, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号