完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家,我在用STM32F103ZET6连接mcp2515模块,和另一块相同型号的开发板通讯,我的配置是正确的,因为经过我用jink读里面的配置寄存器都对了,但是就是发送不了数据到我的另一块板,经确认另一块板的通讯是可以的,以下是我的MCP2515配置代码:
SPIReset();//MCP2515复位,进入配置模式 // delay_ms(1); /*--------初始化接收过滤器,接收屏蔽器-----*/ SPIByteWrite(RXM0SIDH,0x00); SPIByteWrite(RXM0SIDL,0x00); //屏蔽器 SPIByteWrite(RXF0SIDH,0x00);//过滤器 SPIByteWrite(RXF0SIDL,0x00); /*-------------*/ //设置波特率为125Kbps ,共16个tq //setCNF1,SJW=00,长度为1TQ,BRP=1,TQ=[2*(BRP+1)]/Fsoc=2*2/8M=0.5us //number=SPIByteRead(CNF2); SPIByteWrite(CNF1,0x01); //number=SPIByteRead(CNF1); //setCNF2,SAM=0,在采样点对总线进行一次采样,PHSEG1=(6+1)TQ=7TQ,PRSEG=(1+1)TQ=2TQ SPIByteWrite(CNF2,0xB1); //setCNF3,PHSEG2=(5+1)TQ=6TQ,同时当CANCTRL.CLKEN=1时设定CLKOUT引脚为时间输出使能位 SPIByteWrite(CNF3,0x05); //number=SPIByteRead(CNF3); /////////////////////////////////////////////////////////////// //setTXB0,设置发送缓冲器0的标识符和发送的数据,以及发送的数据长度 SPIByteWrite(TXB0SIDH,0x00);//设置发送缓冲器0的标准标识符,待修改*** SPIByteWrite(TXB0SIDL,0x00);//用到标准标识符 //SPIByteWrite(TXB0D0,0x1E);//有待修改及确定是否使用 //SPIByteWrite(TXB0D1,0x10);//有待修改及确定是否使用 /*setTXB1 SPIByteWrite(TXB1SIDH,0x50);//SetTXB0SIDH SPIByteWrite(TXB1SIDL,0x00);//SetTXB0SIDL SPIByteWrite(TXB1DLC,0x40|DLC_8);//SetDLC=3bytesandRTRbit*/ //设置接收缓冲器0的标识符和初始化数据 SPIByteWrite(RXB0SIDH,0x00);//设置接收缓冲器0的标准标识符,待修改*** SPIByteWrite(RXB0SIDL,0x60);//用到标准标识符 SPIByteWrite(RXB0CTRL,0x60);//仅仅接收标准标识符的有效信息,FIILHIT0=0表示RXB0,采用FILHIT0 SPIByteWrite(RXB0DLC,DLC_8);//设置接收数据的长度为8个字节 SPIByteWrite(RXF0SIDH,0x00);//初始化接收滤波器0,待修改*** SPIByteWrite(RXF0SIDL,0x00); SPIByteWrite(RXM0SIDH,0xFF);//初始化接收屏蔽器0,待修改*** SPIByteWrite(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//设置正常模式 dummy=SPIByteRead(CANSTAT);//如果还处于配置模式,就进入工作模式配置 if(OPMODE_NORMAL!=(dummy&&0xE0)) { SPIByteWrite(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//判断进入正常工作模式 dummy=SPIByteRead(CANSTAT); } 以上是我的初始化代码;下面是我的发送代码 unsignedchartempdata,j; tempdata=SPIByteRead(CAN_RD_STATUS); SPIByteWrite(TXB0DLC,length1);//设置发送的数据长度码 for(j=0;j SPIByteWrite(TXB0D0+j,CAN_TX_Buf[j]); } if(tempdata&0x04)//判断TXREQ标志位 { delay1ms(1); SPIByteWrite(TXB0CTRL,0);//清除TXREQ标志位 while(SPIByteRead(CAN_RD_STATUS)&0x04);//等待TXREQ清零 } CS=0; WriteSPI(CAN_RTS_TXB0);//发送缓冲器0请求发送 CS=1; 就是发送不了,求助下,谢谢大家 |
|
相关推荐
10个回答
|
|
以前我有个项目也是使用MCP2515,结果通讯稳定性不高,搞了很久
当时MCP2515通过SPI接到一个Cortex-A8的芯片,通过CAN与stm32F10x通讯 后来我隐约的看到一些描述,SPI是全双工的通讯,CAN呢? 假设SPI正在发送数据,这时候CAN上其他设备发来很多数据怎么处理? 虽然大多数时候都OK,但是数据量大的时候,偶尔有丢失。 后来我就打定注意,以后使用CAN就再也不选MCP2515了 如果使用,一定要分清主从,做好数据管理,但是这已经违背了CAN的协议本意,不如用485成本还低些
最佳答案
|
|
|
|
今年也遇到这样的问题,浪费了很多时间,还好搞定了
|
|
|
|
赞,加油,我也是费了差不多一个星期才搞定
|
|
|
|
好的,谢答主,确实是不稳定,我使用a7跟STM32通讯的,现在就是在想SPI的波特率和CAN的波特率怎么搭配好点
|
|
|
|
SPI也可以设置为半双工,我想试试
|
|
|
|
你好问下,对于在A8上,spi主从机是用什么函数设置的呢,这个我还是有点不清楚 |
|
|
|
最近也在做CAN通信方面
|
|
|
|
这个段程序是,买SPI转CAN模块时,泥人淘宝店送的51示例程序,进行移植的吧。
冰冻的点,提供的下载要了1个点的积分,下载下来然并卵,我把它放云盘了:http://pan.baidu.com/s/1eS6WOvS 他移植是有问题的,有问题的可以,基于它的移植,做几个修改:时钟要修改,CS自选用要起来。…… 等我的好了,再分享。 |
|
|
|
楼主怎么解决的,可以吧正确代码分享一下吗,我刚开始接触,做了好久还是没有实现
|
|
|
|
个人认为,MCP2515用SPI的通讯来做因该是不会有问题的SPI的通讯速度要比CAN高的多,且MCP2515有中断输出,一般我使用中断接收.
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2234 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2053 浏览 3 评论
4664 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2197 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2734 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 14:33 , Processed in 1.029654 second(s), Total 92, Slave 76 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号