CAN通信(DSP与STM32)(STM32发送数据F28388D接收数据)(F28388D发送数据STM32接收数据)

本文介绍了STM32F407与F28388D之间的CAN通信调试过程,包括如何正确配置滤波器以确保数据能够被正确接收,以及发送大量数据时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、(STM32F407发送数据,F28388D接收数据)

调试例程的过程中,出现的问题:
可以有F28388D给STM32发送数据,但是STM32给28388D发送数据,28388D接收不到。
**原因:**接收端滤波
在这里插入图片描述
研究例程的过程中,看到上图这个地方,修改了下图中的flag的位置(4),就能够接收任意ID的数据。3的位置,是需要与发送端(我使用的是STM32F407)的模式一致(都为STD或者都为EXT)。
2的位置,本身是0x00000001,我修改为0x00000000,这样改是为了将过滤器忽略(这也是一直接收不到STM32数据的原因)                             2、3、4按照上述,修改完毕后,1的位置,无论如何改msgID(当然,这个地方的ID长度要注意一下,它是与3的位置配置的STD和EXT模式相关,STD模式不能超过11位,EXT不能超过29位),都不影响数据的接收。                                                                              至此,STM32F407发送数据,F28388D接收数据的过程,按照上述修改,可以实现调通。
图中2的位置,本身是0x00000001,我修改为0x00000000,这样改是为了将过滤器忽略(这也是一直接收不到STM32数据的原因)。
2、3、4按照上述,修改完毕后,1的位置,无论如何改msgID(当然,这个地方的ID长度要注意一下,它是与3的位置配置的STD和EXT模式相关,STD模式不能超过11位,EXT不能超过29位),都不影响数据的接收。
至此,STM32F407发送数据,F28388D接收数据的过程,按照上述修改,可以实现调通。
例程 名称:
can_ex5_transmit_receive.c
例程路径:
C:\ti\c2000\C2000Ware_3_03_00_00\driverlib\f2838x\examples\c28x\can
(本过程使用的程序是TI提供的)

2、(F28388D发送数据,STM32F407接收数据)

当使用DSP28388D的CANB通道给STM32发送数据时,只需要使用TI提供的例程,修改引脚和CAN通道就行,不需要更改上面的图片中的设置。

例程名称:
can_ex5_transmit_receive
TI的例程位置:
C:\ti\c2000\C2000Ware_3_04_00_00\driverlib\f2838x\examples\c28x\can
但是,如果stm32不进行滤波器的设置,就只有电平变化信号,没有数据显示。
下图,就是对STM32的滤波器的设置。
过滤器高16位(图中标号为1),需要全设置为0.
低16位(图中2的位置),最好也设置为0。尽管我们在设置的过程中,发现低16位随便怎么设置,都不影响STM32接收到来自DSP的数据。
在这里插入图片描述
至此,F28388D发送数据,STM32F407接收数据的过程,按照上述修改,可以实现调通。

2.1 发送特别长的数据
出现的故障:当需要发送的数组长度超过8时,程序就会运行故障(如下图所示)。在这里插入图片描述
解决方法:
1、一定要保证下面的函数中的MSG_DATA_LENGTH,只能小于等于8,不能大于8.
CAN_sendMessage(CANB_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH,send_addr);

2、每次发送完一包数据后(数据特别长的话,想要通过CAN发送出去的话),一定要加上延时(如下面代码)。
CAN_sendMessage(CANB_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH,send_addr);
DEVICE_DELAY_US(260);

3、打包函数如下:
void distri_bag_tx(char* txaddr,uint16_t len)
{
uint16_t zhengbao_num = 0;
uint16_t yu_num = 0;
uint16_t i,j;
char send_addr[8]={0};
zhengbao_num = len/8;
yu_num = len % 8;
//如果余数为0
if(yu_num == 0)
{
for(j=0;j<zhengbao_num;j++)
{
for(i=0;i<8;i++)
{
send_addr[i]=txaddr[i+8j];
}
CAN_sendMessage(CANB_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH,send_addr);
DEVICE_DELAY_US(330);
}
}
else //余数不为0的时候,包数多一包,这时需要先发整数包,再发余数包
{
for(j=0;j<zhengbao_num+1;j++)
{
if(j<zhengbao_num)
{
for(i=0;i<8;i++)
{
send_addr[i] = txaddr[i+8
j];
}
}
else
{
for(i=0;i<yu_num;i++)
{
send_addr[i] = txaddr[i+8*j];
}
}
CAN_sendMessage(CANB_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH,send_addr);
DEVICE_DELAY_US(330);
}
}
}

当需要发送的数据总长度发生改变时,就需要修改发送函数下面的延时长度,匹配到一个最合适的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinxinjiaoliu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值