完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
可以的吧.
|
|
|
|
试一下,不就知道了。
|
|
|
|
我试了好像不行,所以来问问情况,求证一下
|
|
|
|
要在初始化模式,才能修改波特率和时间片。
|
|
|
|
|
|
|
|
能否上传工程给需要的朋友参考?
|
|
|
|
我可以把关于CAN的上传,但是不是stm芯片的,而是飞思卡尔的一款单片机,可以吗?
|
|
|
|
都可以.
|
|
|
|
参数:usBaudRate为要设的波特率,stInit是一个结构体
unsigned char sj,p; unsigned char t_seg1, t_seg2; unsigned char BRP = stInit.ucBaudRate; unsigned int uiDMR = 0, uiDAR = 0; //使能CAN CANCTL1_CANE = 1; //进入初始化模式 if (!(CANCTL1&0x01)) CANCTL0 =0x01; // 确认是否进入初始化模式 while (!(CANCTL1&0x01)); //********************* 设置ID过滤器**************************************** switch(stInit.ucFilterMode) { case 0: { // Disables all the Filters CANIDMR0 = 0xFF; CANIDMR1 = 0xFF; CANIDMR2 = 0xFF; CANIDMR3 = 0xFF; CANIDMR4 = 0xFF; CANIDMR5 = 0xFF; CANIDMR6 = 0xFF; CANIDMR7 = 0xFF; break; } case 1: { //Abales Filter0; CANIDAC_IDAM0 = 1; CANIDAC_IDAM1 = 0; if(stInit.uiFilterID1 == 0 || stInit.uiFilterID2 == 0) { uiDAR = stInit.uiFilterID1 | stInit.uiFilterID2; uiDMR = 0; } else { uiDAR = stInit.uiFilterID1; uiDMR = stInit.uiFilterID1 ^ stInit.uiFilterID2; } CANIDAR0 = (unsigned char)(uiDAR >> 3); CANIDAR1 = (uiDAR & 0x07) << 5; CANIDMR0 = (unsigned char)(uiDMR >> 3); CANIDMR1 = ((uiDMR & 0x07) << 5) | 0x1f; CANIDAR2 = 0; CANIDAR3 = 0; CANIDMR2 = 0x00; CANIDMR3 = 0x1f; if(stInit.uiFilterID3 == 0 || stInit.uiFilterID4 == 0) { uiDAR = stInit.uiFilterID3 | stInit.uiFilterID4; uiDMR = 0; } else { uiDAR = stInit.uiFilterID3; uiDMR = stInit.uiFilterID3 ^ stInit.uiFilterID4; } CANIDAR4 = (unsigned char)(uiDAR >> 3); CANIDAR5 = (uiDAR & 0x07) << 5; CANIDMR4 = (unsigned char)(uiDMR >> 3); CANIDMR5 = ((uiDMR & 0x07) << 5) | 0x1f; CANIDAR6 = 0; CANIDAR7 = 0; CANIDMR6 = 0x00; CANIDMR7 = 0x1f; break; } } //设置波特率 switch(usBaudRate) { case BAUDRATE_50K: sj=(SJW_50K-1)<<6; p=(PRE_50K-1); t_seg1=(T_SEG1_50K-1); t_seg2=(T_SEG2_50K-1)<<4; break; case BAUDRATE_100K: sj=(SJW_100K-1)<<6; p=(PRE_100K-1); t_seg1=(T_SEG1_100K-1); t_seg2=(T_SEG2_100K-1)<<4; break; case BAUDRATE_125K: sj=(SJW_125K-1)<<6; p=(PRE_125K-1); t_seg1=(T_SEG1_125K-1); t_seg2=(T_SEG2_125K-1)<<4; break; case BAUDRATE_250K: sj=(SJW_250K-1)<<6; p=(PRE_250K-1); t_seg1=(T_SEG1_250K-1); t_seg2=(T_SEG2_250K-1)<<4; break; case BAUDRATE_500K: sj=(SJW_500K-1)<<6; p=(PRE_500K-1); t_seg1=(T_SEG1_500K-1); t_seg2=(T_SEG2_500K-1)<<4; break; case BAUDRATE_800K: sj=(SJW_800K-1)<<6; p=(PRE_800K-1); t_seg1=(T_SEG1_800K-1); t_seg2=(T_SEG2_800K-1)<<4; break; case BAUDRATE_1000K: sj=(SJW_1000K-1)<<6; p=(PRE_1000K-1); t_seg1=(T_SEG1_1000K-1); t_seg2=(T_SEG2_1000K-1)<<4; break; default: break; } //选择时钟源 CANCTL1_CLKSRC=0; // 设置SJW和Tq clock分频器 CANBTR0 = (sj|p); // 设置时间段1和时间段2 CANBTR1 = (t_seg1 | t_seg2); CANCTL1 = 0x84; // 设置CAN的loop功能 if(stInit.ucLoopEnable == 1) CANCTL1_LOOPB = 1; else CANCTL1_LOOPB = 0; CANCTL0 = 0x00; // 让CAN进入正常运行模式 while(CANCTL1&0x01); // 确认CAN进入正常模式 while(!(CANCTL0&0x10)); //等待CAN同步 CANRIER_RXFIE = 1; // 使能接收中断 |
|
|
|
代码不方便完全上传,不过这部分就是整个CAN初始化的一个过程了。当然代码不完善,还有许多要改进的地方。如果有什么问题可以一起讨论,共同进步。
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1792 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1626 浏览 1 评论
1094 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
732 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1682 浏览 2 评论
1943浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
740浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
577浏览 3评论
600浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
562浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 05:00 , Processed in 1.292878 second(s), Total 99, Slave 82 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号