Cypress技术william hill官网
直播中

周彦楠

7年用户 222经验值
私信 关注
[问答]

psoc 5与afe4300的spi通信出错该怎么办?

你好,我遇到了一些我很难弄清楚的行为。我在全双工模式下使用SPI主机,只使用硬件FIFO(无中断)与外部芯片通信。我可以通过SPI写得很好。我还可以看到,设备对我的SPI主命令的响应是正确的,因为预期数据是由Oracic分析器看到的。也就是说,来自创建者API的SpimRead ReXDATA不符合预期。这是因为SpimgGeTrxBuffResiZe()返回了不正确的字节数。
如果我通过SPIM发送3字节的数据,我应该接收3字节的数据(即使它是垃圾),因为它是基于移位寄存器的,并且与主时钟同步。我有时会得到一个,但通常是零字节。所以,我很困惑。下面是代码片段。有人对这件事有什么想法吗?
静态BoLoT AFE4300读取(UIT88T地址,Uti1616T*PDATA)/ **********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************3字节写*由AFE的硬件定义,不能改变。第一字节*始终是要从中读取数据的寄存器。下一个16位*传输是数据。除了数据寄存器之外,所有寄存器都必须在读过之后重新写入。************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************ATA将高位字节移出设备SPIMUWRIGETXDATA(0x00);/ /发送哑数据以移出设备TEMP=SPIMUGErrxBuffSersie()的低字节;如果(TEMP>=3){SPIMARRead RXDATA();//忽略地址在HythByth= SPIMARRead ReXDATA()中的地址移位;LuxByth.SPimaRead RxDATA();* pDATa=((UI)NT16It)HythByg & lt;lt;(UTI1616T)低字节;//写入RX数据返回设备,除非它是ADC寄存器(如果是ADCYDATAL ReGEADADR!){地址){//重新写入数据到寄存器SPIMGWORTETXDATA(地址“AdvrsScript写Enabl”);SpimthWruteXDATA(Hyb字节);SpimthWruteXDATA(低字节);}成功=TRUE;} /*注意:如果成功为假,AFE处于未知状态,将需要重置* /返回(成功);} & lt;/PRE& GT;我把一个主时钟数据的PNG附加在从属设备上。主控制器写一个0x21以从从属数据中获得数据,后面跟着两个哑字节。虚拟字节被正确地验证为包含0x81x0xc3和0xc3。PSoC由于某种原因没有接收到这些字节。
谢谢您。
数据恢复
68.8 K

回帖(3)

王琳

2019-10-16 14:12:05
能否请您发布您的完整项目,以便我们都可以查看您的所有设置。要做到这一点,使用C造饰者和GT;文件-GT;创建工作区束(最小)并附加结果文件。
鲍勃
举报

姜钰

2019-10-16 14:32:00
OxWruteXDATA()将值放在TXFIFO中。它不会等到数据被发送。因此,您检查RX缓冲区的大小太早了。检查SPI状态并等待直到所有字节都被发送。
举报

周彦楠

2019-10-16 14:38:26
引用: lxhzx 发表于 2019-10-16 16:43
OxWruteXDATA()将值放在TXFIFO中。它不会等到数据被发送。因此,您检查RX缓冲区的大小太早了。检查SPI状态并等待直到所有字节都被发送。

你是对的。问题有两个部分。第一个是,如果不使用软件缓冲区,检查RX缓冲区功能是不起作用的。因此,为了使软件缓冲器能够启用,我不得不将缓冲区大小增加到4字节以上。然后我可以等待SpimSimple完成并检查数据。当然,如果我发送3个字节,RX FIFOSH也应该有3个字节,所以检查RX缓冲区大小是不必要的。
谢谢。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分