Part Number:TMS320C6748
使用C6748作从机,A5作主机,使用SPI1三线模式,目前存在两个问题:1. 传输数据太多 程序会卡死 卡死在while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) ); 接收判断处,项目需要收发16092个8位的数据, 但是如果收发4000个数据,程序可正常跑通,但收发多一些 程序就会卡死(在收发十几个数的时候就会停到接收判断处)。2. 设置收发4023个数据,程序可跑通,但是DSP收到A5的数据不正确,用A5给DSP全发数字5, 经过打印只有前几个数是正常的5 ,后边的数就像是随机数,不是5且一直变化。
怀疑是两边时钟的问题,但是做从机不需要设置时钟吧 ,A5的SPI时钟设置为10Mhz; 以前采用的是STM32F4与A5通信 ,通信正常,现在想用DSP代替32。
还有一个问题就是从6748的技术参考手册看 SPI的缓冲区TXBUF和RXBUF未说明是多大的 ,这个缓冲区多大呢 会不会是缓冲区太小的问题。 感谢大家。
Shine:
请问中断程序中有对数据做处理吗?中断子程序越简单越好。
,
Zecheng Zhang:
您好 未做处理 我使用的不是SPI中断 传输程序如下:
void SPI1_Communicate(uint8_t * sp2TxBuffer, uint8_t * sp2RxBuffer, int NumByteToRead){
NumByteToRead++;
SPIDat1Config(SOC_SPI_1_REGS, SPI_DATA_FORMAT0, 0x1); while (–NumByteToRead) {
while( HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & (0x20000000));
SPITransmitData1(SOC_SPI_1_REGS, *sp2TxBuffer); sp2TxBuffer++;
if(NumByteToRead == 16092) {
GPIOPinWrite(SOC_GPIO_0_REGS, 9, GPIO_PIN_HIGH); //GPIO0[8]向A5发送高电平,A5接收高电平触发SPI中断向DSP发数 GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH);//LED } else {
while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) ); *sp2RxBuffer = SPIDataReceive(SOC_SPI_1_REGS); sp2RxBuffer++;
} if(NumByteToRead == 1) {
while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) );
*sp2RxBuffer = SPIDataReceive(SOC_SPI_1_REGS); sp2RxBuffer++; } }
}
因为之前在STM32中也采取的这种写法 您看下有什么问题吗
,
Zecheng Zhang:
由于发的是8位数 所以让A5给DSP全发255 打印出来正确 怀疑是乱位了 一般什么情况会导致乱位呢?
,
Shine:
请问在dsp端有做过DLB内部自环测试吗?
,
Zecheng Zhang:
试过的 没问题 今天又试了下 两块DSP C6748开发板互相通信 程序没动 发现通信没问题, 但是发现传16092个数的时候 偶尔会出现数乱的情况(之前传4023个 没有数乱的情况) ,把速率改为20M 问题解决。 但是和A5那边通信还是不行 , 是不是由于两边频率的问题 实在想不明白
,
Shine:
出错时,请看一下SPI Receive Buffer Register (SPIBUF)寄存器的状态,看是什么错误状态信息。
,
Zecheng Zhang:
感谢回复 , 看了下 当传数乱的时候 只有RXTADA有变化 没有其他错误信息 此时传的全是0 不知道为什么会接收到乱位的1
,
Zecheng Zhang:
发现和A5通信的时候RXEMPTY 和TXFULL 寄存器一直没变化,那是怎么传过来数的呢 和另一块DSP通信 这两个寄存器变化正常
,
Tony Tang:
如果判断根数据长度有关系,建议看一下buffer位置的安排是不是有问题,buffer是定义的全局变量?长度在定义的时候就分配够了吗?
,
Zecheng Zhang:
您好 感谢回复 是定义的全局变量 长度分配也是够的 和另一块DSP通信是没有问题的 ,现在有个很奇怪的现象 ,和A5进行通信 如果发的数据少 程序可以正常跑通但是传过来的数据不对 RXEMPTY TXFULL 寄存器一直是0 ,但是发数据多 程序就会卡死 ,RXEMPTY TXFULL 寄存器一直是1. 但与另一块DSP通信则正常 两寄存器 0 1 交替变化
,
Tony Tang:
Zecheng Zhang 说:SPIDat1Config(SOC_SPI_1_REGS, SPI_DATA_FORMAT0, 0x1);
这个操作的结果是给FORMAT0寄存器写的什么值?如果是写的1,那么是不对的。
,
Zecheng Zhang:
感谢指正 已修改 但是还是和之前一样的 RXEMPTY TXFULL 寄存器一直为0
,
Zecheng Zhang:
发现 只接CLK线 不接MISO MOSI 传数少时 RXEMPTY TXFULL 寄存器一直是0 这一点很奇怪 按理说没有收到数RXEMPTY应该是1才对吧
,
Tony Tang:
关注CLK上是否有时钟,数据线接不与接不影响状态,无非数据都为0.
,
Zecheng Zhang:
现在修改A5的CLK时钟 发现3M以下 可以传送16000多个数不会卡死 但是4M以上 传16000多个数就会卡死 但是收到的数都是错误的 可是两个DSP之间20MHZ都没问题 也可以发送16000多个数
,
Zecheng Zhang:
当A5给DSP发的是00000101时 ,观察到RXDATA寄存器收到的为:00001010、1010000、00101000、10000001 都是这种 像是整体移位了 ,而且A5调整通信速率为4M以上 多的数就传不了了 这是怎么回事呢 您感觉是DSP端的问题还是A5端的问题呢
,
Tony Tang:
把SPI所有寄存器值抓下来检查核对一下。
把SPI的信号用示波器抓下来,看信号质量,时序向位、极性是否是否匹配。
,
Zecheng Zhang:
寄存器 RXEMPTY TXFULL都没发生变化 只有RXDATA在变收到的数据都是错位的 就是101 整体前移后移
测了下波形 CLK:
MOSI:
MISO:
相位和极性四种模式都试过 没什么变化
,
Zecheng Zhang:
看波形MISO波形异常
,
Zecheng Zhang:
不好意思 上午回复您的SOMI波形异常是由于发的数比接收的少导致的 , 下午又重新测试了一下 并于STM32-A5(目前正常使用的)的波形做了对比,发现只是信号质量略差 其他的没问题 , 您感觉还能是什么问题呢 ,期待您的回复
STM32-A5:
DSP-A5:
,
Tony Tang:
为什么不把时钟,数据信号放在一起测量呢?
依据什么判断你的寄存器配置没有问题?
,
Zecheng Zhang:
目前传输异常,寄存器只有RXDATA会有变化 其他寄存器都不显示变化 RXEMPTY TXFULL 一直为0 不知道为什么会出现这种问题。
,
Zecheng Zhang:
现在可以传输但是DSP接收到的数第八位一直是1 不管传什么第8位都是1
,
Zecheng Zhang:
第八位一直是1,后七位向右移动了1位 这种问题该怎么解决呢
,
Shine:
两块dsp互相通信也会第八位一直是1么?
,
Zecheng Zhang:
您好 问题解决了 不知道为什么 之前一直注意CCS的寄存器显示 发现显示一直有问题, 所以被误导了 。
,
Shine:
非常高兴您的问题解决了,感谢告知解决方法!
,
Zecheng Zhang:
还是通信速率以及相位和极性的问题, 由于之前A5端没有正确修改通信速率导致当时更改相位极性没能解决。
,
Shine:
感谢~