打印
[STM32F1]

通讯问题

[复制链接]
1003|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pengf|  楼主 | 2022-1-2 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在用STM32F103ZET6连接mcp2515模块,和另一块相同型号的开发板通讯,我的配置是正确的,因为经过我用jink读里面的配置寄存器都对了,但是就是发送不了数据到我的另一块板,经确认另一块板的通讯是可以的

使用特权

评论回复
沙发
chuxh| | 2022-1-2 11:56 | 只看该作者
配置代码发出来看下

使用特权

评论回复
板凳
pengf|  楼主 | 2022-1-2 11:58 | 只看该作者

        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<length1;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;
就是发送不了,求助下,谢谢大家

使用特权

评论回复
地板
xxrs| | 2022-1-2 12:00 | 只看该作者
以前有个项目也是使用MCP2515,结果通讯稳定性不高

使用特权

评论回复
5
jiajs| | 2022-1-2 12:02 | 只看该作者
先测试下回环,确定下是CAN模块的问题。

使用特权

评论回复
6
juventus9554| | 2022-1-2 12:04 | 只看该作者
换成TJA1050模块吧。

使用特权

评论回复
7
pengf|  楼主 | 2022-1-2 12:06 | 只看该作者
SPI是全双工的通讯,CAN呢?

使用特权

评论回复
8
jiajs| | 2022-1-2 12:10 | 只看该作者
假设SPI正在发送数据,这时候CAN上其他设备发来很多数据怎么处理?

使用特权

评论回复
9
wangzsa| | 2022-1-2 12:12 | 只看该作者
使用MCP2515的CAN,一定要分清主从,做好数据管理

使用特权

评论回复
10
ousj| | 2022-1-2 12:14 | 只看该作者
这违背CAN的协议本意,不如用485成本还低些

使用特权

评论回复
11
huanghuac| | 2022-1-2 12:16 | 只看该作者
确实是不稳定,我使用a7跟STM32通讯的,现在就是在想SPI的波特率和CAN的波特率怎么搭配好点

使用特权

评论回复
12
jlyuan| | 2022-1-2 12:17 | 只看该作者
SPI也可以设置为半双工

使用特权

评论回复
13
wyjie| | 2022-1-2 12:19 | 只看该作者
对于在A8上,spi主从机是用什么函数设置的呢

使用特权

评论回复
14
renyaq| | 2022-1-2 12:21 | 只看该作者
个人认为,MCP2515用SPI的通讯来做因该是不会有问题的SPI的通讯速度要比CAN高的多,且MCP2515有中断输出,一般我使用中断接收.

使用特权

评论回复
15
yinxiangh| | 2022-1-2 12:24 | 只看该作者
可以吧正确代码分享一下吗

使用特权

评论回复
16
renyaq| | 2022-1-2 12:26 | 只看该作者
有没有接收端和匹配电阻呢

使用特权

评论回复
17
zhanghqi| | 2022-1-2 12:28 | 只看该作者
换一种协议吧试试

使用特权

评论回复
18
stly| | 2022-1-2 12:30 | 只看该作者
这个,肯定可以做,应该是没有设置对。

使用特权

评论回复
19
huwr| | 2022-1-2 12:33 | 只看该作者
CAN的底层已经调通的话,如果该芯片不好可以再换其它芯片

使用特权

评论回复
20
zhanghqi| | 2022-1-2 12:36 | 只看该作者
stm32自带can吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

718

主题

10129

帖子

3

粉丝