牛卧堂MCU技术交流
标题:
M031 SPI SLAVE發送資料問題
[打印本页]
作者:
mento
时间:
2020-12-23 15:06
标题:
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上並沒有找到類似的函式
請問還需加上什麼程序?謝謝
作者:
匿名
时间:
2020-12-24 12:10
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
您好,我修改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
往fifo里填数据前,需要判断FIFO是否已经满了。
作者:
admin
时间:
2020-12-25 17:55
微信图片_20201225175448.png
(23.78 KB, 下载次数: 369)
下载附件
2020-12-25 17:55 上传
作者:
mento
时间:
2020-12-28 12:15
您好,此判斷式在先前都有試過了,沒有什麼差異
請問有沒有SLAVE類似此應用的範例供參考?
現在觀察到的波型是在連續丟同樣的命令下,MISO和MOSI的波形同時在動作,
就是MASTER該收到的8筆資料中的前二筆與MASTER發送的二筆命令重疊,所以只讀到後面的六筆資料,
同樣在發送第一次命令後,MISO完全沒波型,第二次有看到八筆資料, 但前二筆與MOSI重疊。
而此MASTER的程序在M058當SLAVE時是正常動作的
欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/)
Powered by Discuz! X3.2