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接收数据的过程,按照上述修改,可以实现调通。
例程 名称:
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+8j];
}
}
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);
}
}
}
当需要发送的数据总长度发生改变时,就需要修改发送函数下面的延时长度,匹配到一个最合适的长度。