找回密码
 立即注册

QQ登录

只需一步,快速开始

开启左侧

[M051] M031 SPI SLAVE發送資料問題

[复制链接]
mento 发表于 2020-12-23 15:06:42 | 显示全部楼层 |阅读模式
您好,
先前是使用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上並沒有找到類似的函式

請問還需加上什麼程序?謝謝

回复

使用道具 举报

匿名  发表于 2020-12-24 12:10:59
1、NUC123 有个FIFO模式的使能位。非FIFO模式,设置GO_BUSY=1启动传输;FIFO模式,往TX FIFO里填入数据启动传输。
2、M031没有FIFO模式使能位,但有传输使能位SPIEN(在SPI_Open函数里设置了),SPIEN位被设置后,作为从机,只要发送FIFO里有数据,一旦收到clk,就会把数据往外传。
3、前面所说的传输都是在片选信号有效的基础上。
4、建议将完整代码贴出来看一下。
回复 支持 反对

使用道具

 楼主| mento 发表于 2020-12-24 17:58:47 | 显示全部楼层
您好,我修改M031的Sample code : SPI_SlaveFIFOMODE,內容如下:
void SPI_Init(void)
{
                SPI_Open(SPI0, SPI_SLAVE, SPI_MODE_0, 32,(uint32_t) NULL);               
                SPI_EnableInt(SPI0, SPI_UNIT_INT_MASK);
                NVIC_EnableIRQ(SPI0_IRQn);
}

uint32_t SPI_RX_DATA[2];
uint8_t SPI_RX_DATA_CNT = 0;
uint8_t i=0;

void SPI0_IRQHandler(void)
{
                if( SPI_GetIntFlag(SPI0, SPI_UNIT_INT_MASK))
                {
                                SPI_ClearIntFlag(SPI0, SPI_UNIT_INT_MASK);  
                       
                                SPI_RX_DATA[SPI_RX_DATA_CNT] = SPI_READ_RX(SPI0);
                                SPI_RX_DATA_CNT++;
                       
                                if( SPI_RX_DATA_CNT == 2 )
                                {
                                                if( SPI_RX_DATA[0] == 0xB0000000 && SPI_RX_DATA[1] == 0x4FFFFFFF )
                                                {
                                                                for(i=0;i<8;i++)
                                                                {                                               
                                                                                SPI_WRITE_TX(SPI0, 0x12345600); /* Write to TX FIFO */
                                                                                //while(!SPI_GetStatus(SPI0, SPI_TX_EMPTY_MASK));
                                                                }                                                       
                                                }       
                                               
                                                SPI_RX_DATA_CNT = 0;
                                }                                               
                }
}

MASTER與SLAVE之間的溝通為:
MASTER送出 ( 0xB0000000,  0x4FFFFFFF ) 後,將從SLAVE接收8筆32位元的資料

從示波器上觀察,CS、CLK、MOSI動作皆正常,
MASTER第一次發送命令時,CLK最後面的八筆資料MISO並無動作。
MASTER第二次發送命令時,CLK最後面的三筆資料MISO並無動作,也就是說MASTER從SLAVE接收到前5筆正確的資料。
MASTER第三次發送命令時,等同第一次的狀況。
MASTER第四次發送命令時,等同第二次的狀況。


以此類推

回复 支持 反对

使用道具 举报

admin 发表于 2020-12-25 17:54:34 | 显示全部楼层
往fifo里填数据前,需要判断FIFO是否已经满了。
牛卧堂
回复 支持 反对

使用道具 举报

admin 发表于 2020-12-25 17:55:08 | 显示全部楼层
微信图片_20201225175448.png
牛卧堂
回复 支持 反对

使用道具 举报

 楼主| mento 发表于 2020-12-28 12:15:15 | 显示全部楼层
您好,此判斷式在先前都有試過了,沒有什麼差異

請問有沒有SLAVE類似此應用的範例供參考?
現在觀察到的波型是在連續丟同樣的命令下,MISO和MOSI的波形同時在動作,
就是MASTER該收到的8筆資料中的前二筆與MASTER發送的二筆命令重疊,所以只讀到後面的六筆資料,

同樣在發送第一次命令後,MISO完全沒波型,第二次有看到八筆資料, 但前二筆與MOSI重疊。
而此MASTER的程序在M058當SLAVE時是正常動作的
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU