新唐MCU技术
直播中

王芳

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

关于M031 SPI SLAVE发送资料问题

您好,
先前是使用NUC123当SPI MASTER,M058为SPI SLAVE,双方数据的沟通是正常的,
现在将SLAVE端的MCU改成M031,SLAVE端的接收同样是正确的,但发送资料有问题。

出现的问题为SLAVE在连续发送同样的数据(PACKAGE)时,第一次没输出波形、第二次则会成功,
简单的说就是MASTER必须发送二次命令才能取得SLAVE的资料。

如果直接改M031的 SAMPLE CODE也是同样的状况。

A.  SPI MASTER FW的程序如下(NUC123):
1.  CS                                                                -->LOW
2.  SpiSendData                                                  -->发送命令1-1
3.  SpiSendData                                                  -->发送命令1-2
4.  for(i = 0; i < 8; i++)                                      -->接收8笔来自SLAVE的资料
     {   
          SpiSendData(DeviceNo, 0xFFFFFFFFUL);
          *(pu32Buf + i) = SpiGetData(DeviceNo);
          Delayclock(100);
     }
5.  CS                                                               -->HIGH

SpiSendData的函式内容为:
SPI_WRITE_TX0(SPI2, u32Data);   
SPI_SET_GO(SPI2);
while(SPI_IS_BUSY(SPI2) != 0);



B.  SPI SLAVE FW的程序如下(M031):
1.  取得二笔来自MASTER的32位元资料并验证
2.  if(USPI_GET_TX_FULL_FLAG(USPI0) == 0)
        SPI_WRITE_TX(SPI0, TransmitData); /* Write to TX FIFO */

在示波器上看到的现象为,当MASTER第一次发出命令后,SLAVE端在执行 SPI_WRITE_TX后MISO并无输出波形;
而MASTER第二次发出命令后,SLAVE端在执行 SPI_WRITE_TX后可输出波形,
所以要取得SLAVE的资料需发送二次命令。

NUC123用的是旧版的Library,将要发送的资料填至TX buffer后,有再去唿叫SPI_SET_GO(SPI2);
而M031是否也要唿叫相似的命令呢?目前从Sample code上并没有找到类似的函式

请问还需加上什么程序?谢谢

回帖(1)

郑聪

2023-8-21 11:17:27
1、NUC123 有个FIFO模式的使能位。非FIFO模式,设置GO_BUSY=1启动传输;FIFO模式,往TX FIFO里填入数据启动传输。
2、M031没有FIFO模式使能位,但有传输使能位SPIEN(在SPI_Open函数里设置了),SPIEN位被设置后,作为从机,只要发送FIFO里有数据,一旦收到clk,就会把数据往外传。
3、前面所说的传输都是在片选信号有效的基础上。
4、建议将完整代码贴出来看一下。
举报

更多回帖

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