完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最近调试TMS570,有个关于SPI的问题纠结了很久。下面对问题进行描述:
首先,是SPI的硬件连接:570作为主设备,和某从设备连接,使用了SPI2。因为只有一个从设备,所以SPI2的片选和ENA都没有用。两个设备间SPI2SIMO和SPI2SOMI对应直接连接,SPI2CLK相连,并串联一个22欧姆的电阻。 其次,是测试程序的配置:使能 SPI2 driver,不使用中断,波特率1000,片选、ENA管脚用作普通的IO口。程序工作过程:570主设备发送一个字符到从设备,从设备立即把这个字符返回发给主设备570。 出现的问题:在使用JTAG单步调试的时候,570主设备收到的数据总会错位。例如发送的是0xAA,收到的是0x55,只能收到高7位,最低位丢了!, 从示波器抓到的波形看,从设备是从第二个时钟周期才开始有数据。但是,当不用JTAG调试的时候,单纯使用示波器看波形,或者数据判断正确后点亮LED来 指示,这些情况下,数据竟然是正确的! 请问造成这样问题的原因可能是什么? MCU:TMS570LS3137 开发环境:CCSv5 + HalCoGen3.01 JTAG Emulator:XDS100v2 (BlackHawk: BH-USB-100v2) |
|
相关推荐
5个回答
|
|
Hi Look,
单从描述中来看,我觉得很难确定问题的原因。 有以下几种可能性: 1. 单步调试。 一般情况下,做通信的调试,不建议使用单步,因为Step命令相当于[执行当前指令]+[断点],断点会使MCU中的一些模块停止工作,比如CPU等。 我估计SPI2在breakpoint的时候也停止了工作,所以才会出现你说的数据不正常的情况。 可以尝试不要使用[Step],而是用如[Step Over],或者在判断传输完成处加breakpoint来暂停CPU。 2. 可以检查一下SPI Data Format Register中的POLARITY和PHASE位的设置。但是你提到全速运行时通信没有问题,所以polarity和phase出问题的可能性小。 3. SPI2应该也有loopback模式吧,可以尝试先用loopback模式,SPI2自发自收。如果这样下载数据仍然不正确,则可以排除在信号回路上的问题。 基本上可以确认是调试断点的问题了。如果这样下载没有问题,那么可能在信号回路上还要好好检查一下,可能是外部仍然存在问题。 |
|
|
|
Hi Renton, 在程序合适的位置设置了断点,问题依然存在。 把570的代码贴在下面了,程序运行流程: 主设备MCU:t1->Send Data(非Dummy Data), t2->Recv Dummy Data, t3->Send Dummy Data(为了保持CLK), t4->Recv Data. 从设备: t1->Send Dummy Data, t2->Recv Data(非Dummy Data), t3->Send Data, t4->Recv Dummy Data(清空RX register). 注:t1, t2, t3, t4代表时间顺序。 代码: #define DUMMY_DATA 0xFF unsigned char sendData = 0xA5; while(1) [ while ((spiREG2->FLG & 0x0200) == 0); spiREG2->DAT1 = sendData | 0x100D0000; // Send Data while ((spiREG2->FLG & 0x0100) == 0); retVal = (unsigned char)spiREG2->BUF; // receive Dummy data if(sendData != DUMMY_DATA) [ while ((spiREG2->FLG & 0x0200) == 0); spiREG2->DAT1 = DUMMY_DATA | 0x100D0000; // Send Dummy Data while ((spiREG2->FLG & 0x0100) == 0); retVal = (unsigned char)spiREG2->BUF; // receive data ] int index = 0x4FFFFF; for(;index>0;index--); // delay /*此处设置断点*/ ] 在For循环处设置了断点,情况和以前一样,MCU 发送0xA5, 收到0x52,MCU 发送0xEE, 收到0x77,而在不用JTAG仿真的情况下,接收正确了!不过有一点可以确信,从设备接收MCU的数据是正确的,JTAG调试模式下的问题出在从设备发送给MCU的过程中。 在全速运行的情况下接收正常,是不是就说明信号回路没有问题了。大胆猜测:难道是JTAG模式下,MCU的负担重了,影响了SPI外设的正常工作(时钟产生,信号采样等)?仅仅是一种猜测,还请Renton指点。 另外,这里的程序设计思路参考了读写SD卡的程序中SPI_send函数: /*------------------------------------------------------------------------------ Write and Read a byte on SPI interface *------------------------------------------------------------------------------*/ unsigned char SPI_send (unsigned char outb) [ while ((spiRegMCUsCom->FLG & 0x0200) == 0); // Wait until TXINTFLG is set for previous transmission spiRegMCUsCom->DAT1 = outb | 0x100D0000; // transmit register address while ((spiRegMCUsCom->FLG & 0x0100) == 0); // Wait until RXINTFLG is set when new value is received return((unsigned char)spiRegMCUsCom->BUF); // Return received value ] 后来,因为前面的从设备是判断收到非Dummy Data时才回复,就怀疑这里的判断造成了一定的延时,所以又改变了从设备的程序过程为及时回复(主设备的不变),如下: 主设备MCU:t1->Send Data(非Dummy Data), t2->Recv Dummy Data, t3->Send Dummy Data(为了保持CLK), t4->Recv Data. 从设备: ta->Recv Data(任何数据), tb->Send Data(立即回复收到的数据). 问题依然如前面所述,难道真的是JTAG调试的介入影响了SPI的外设正常工作?请Renton指点。 Thanks, Regards, Look |
|
|
|
Hi Look, 除了有可能在breakpoint处停止外设工作外, JTAG对外设应该没有严重的影响。 具体是什么原因造成数据移位,还不太能肯定。 我建议还是用Loopback模式测试一下。 |
|
|
|
testd27 发表于 2018-6-21 10:12 Hi Renton, 根据你的建议,测试loopback模式。结果如下: 看了下TMS570LS3137的datasheet,发现SPI有几种LoopBack Mode . 都测试了一下。internal Loopback Test Mode 没有问题,但是Input/Output Loopback Test Mode下, 不管是Digital Loopback 还是Analog Loopback都不能正确接收数据。 测试internal Loopback Test Mode使用的程序: unsigned char sendData = 0xA5; spiREG2 ->LB = 1; while(1) [ int index = 0; for(index=0x3FFFFF;index>0;index--); // delay while ((spiREG2->FLG & 0x0200) == 0); spiREG2->DAT1 = sendData | 0x100D0000; // Send Data while ((spiREG2->FLG & 0x0100) == 0); retVal = (unsigned char)spiREG2->BUF; // receive data for(index=0x3FFFFF;index>0;index--); // delay ] 测试Input/Output Loopback ,先是使用了上面的程序(只是把spiREG2->LB = 1; 这一行换成spiEnableLoopback(spiRegMCUsCom, Digital); ),不能正确接收数据,retVal变量读到的总是0xFF。后来又使用下面的程序测试,还是不能正确接收,retVal变量同样读到的总是0xFF: #define DUMMY_DATA 0xFF unsigned char sendData = 0xA5; #if 1 // enables the Loopback mode for self test - Digital spiEnableLoopback(spiRegMCUsCom, Digital); #else // enables the Loopback mode for self test - Analog spiEnableLoopback(spiRegMCUsCom, Analog); #endif while(1) [ int index = 0; for(index=0x3FFFFF;index>0;index--); // delay while ((spiREG2->FLG & 0x0200) == 0); spiREG2->DAT1 = sendData | 0x100D0000; // Send Data while ((spiREG2->FLG & 0x0100) == 0); retVal = (unsigned char)spiREG2->BUF; // receive Dummy data if(sendData != DUMMY_DATA) [ while ((spiREG2->FLG & 0x0200) == 0); spiREG2->DAT1 = DUMMY_DATA | 0x100D0000; // Send Dummy Data while ((spiREG2->FLG & 0x0100) == 0); retVal = (unsigned char)spiREG2->BUF; // receive data ] for(index=0x3FFFFF;index>0;index--); // delay ] 请问是什么原因造成了Digital Loopback 和 Analog Loopback的失败,程序这样写是否可以? 另外,我使用的是Three-Pin Mode,SPI2CS,SPI2ENA引脚都设置成了GIO,问题会不会因为这个造成的? 最后,需要说明的是,昨天还测试了不同波特率的程序,随之而来的问题更让我困惑。还是使用如下代码: #define DUMMY_DATA 0xFF unsigned char sendData = 0xA5; while(1) [ while ((spiREG2->FLG & 0x0200) == 0); spiREG2->DAT1 = sendData | 0x100D0000; // Send Data while ((spiREG2->FLG & 0x0100) == 0); retVal = (unsigned char)spiREG2->BUF; // receive Dummy data if(sendData != DUMMY_DATA) [ while ((spiREG2->FLG & 0x0200) == 0); spiREG2->DAT1 = DUMMY_DATA | 0x100D0000; // Send Dummy Data while ((spiREG2->FLG & 0x0100) == 0); retVal = (unsigned char)spiREG2->BUF; // receive data ] int index = 0x4FFFFF; for(;index>0;index--); // delay /*此处设置断点*/ ] 变换波特率的测试结果如下: 1000kHz时,在主设备JTAG断点调试下数据错位,JTAG调试全速运行也数据错位,只有非JTAG模式下,正常接收数据。 400kHz或者500KHz时,非JTAG模式下,反而不能正常接收数据,只在从设备的JTAG断点调试下或者JTAG调试全速运行才能正确接收。 10000kHz时,在主设备JTAG断点调试下第一个字节数据错位,以后的数据接收正确,JTAG调试全速运行也是这样,只有非JTAG模式下,所有数据都能正常接收。 其中存在的问题有和波特率有什么内在的联系呢?实在搞不懂了。请Renton给分析一下,谢谢! Regards, Look |
|
|
|
城边草1 发表于 2018-6-21 10:25 是否可以使用while()循环的delay来代替for()循环的delay?我采用上述类似的代码(只是delay的方式不同),在loopback模式下并没有复现楼主的问题。此外,也可以尝试使用SDK中的函数来进行收发,这样通过查询FLG寄存器的值可以知道在收发过程中是哪一步出现了问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
683 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
599 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1054 浏览 1 评论
739 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
524 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
161浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
125浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
126浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
122浏览 12评论
TPA6304-Q1: TPA6304 两片公用一组I2C的话,其中一片配置不成功怎么办
168浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 22:56 , Processed in 0.704774 second(s), Total 56, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号