主題:EM9280-SPI通信問題 共有97794人關注過本帖 |
---|
jagict |
1樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
EM9280-SPI通信問題 Post By:2013-11-1 16:33:00 [只看該作者]
請教,我要實現主控板與一個外接AD芯片AD7949的SPI通信,按照例程上的SPI程序打開SPI設備沒有報錯,writefile與readfile也沒有報錯,writefile發送AD芯片需要的寄存器配置數據,readfile查看RxBuffer的數據,一直都是0,好像是通信不成功,DEBUG口輸出如下信息: SPI_Opened SPI:-792216736 mxs_spi_txrx_pio-W: timeout on waiting CRTL0_RUN cleared mxs_spi_txrx_pio-R: timeout on waiting FIFO_EMPTY 請問可能的問題在哪里? 第一次調試SPI,請大家幫忙,暫時無示波器看波形。
|
單帖管理 | 引用 | 回復 |
x10 |
2樓 |
Post By:2013-11-1 17:05:00 [只看該作者]
有沒有先跑跑我們的例子程序,把SPI_DOUT與SPI_DIN短接,例子程序是一個環回測試,程序能正常運行嗎?
|
|
單帖管理 | 引用 | 回復 |
x10 |
3樓 |
Post By:2013-11-1 17:17:00 [只看該作者]
另外,你手上這張板子是Linux-2.6.35的,還是Linux-3.9.7?
|
|
單帖管理 | 引用 | 回復 |
jagict |
4樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-1 17:28:00 [只看該作者]
板子是燒寫wince系統的,我試試能不能成功,沒有短接的話例子程序也是一樣的輸出信息。
|
單帖管理 | 引用 | 回復 |
zxw |
5樓 |
Post By:2013-11-1 17:33:00 [只看該作者]
有沒有示波器看看時序對不對或波形好不好。
我們也看看這個器件。
|
|
單帖管理 | 引用 | 回復 |
zxw |
6樓 | |
Post By:2013-11-1 17:37:00 [只看該作者]
|
||
單帖管理 | 引用 | 回復 |
jagict |
7樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-2 9:12:00 [只看該作者]
好的,已經去要示波器,對于C#版本就是把spiinit.eLength 定義為SSP_WORD_LENGTH_8BITS = 0xF 吧;
另外定義sSPI.BitCount = 16,Config里面有哪個參數需要配置嗎,spiinit.u16TransferCount = 0這個要改嗎?
[此貼子已經被作者于2013-11-2 9:17:47編輯過]
|
單帖管理 | 引用 | 回復 |
jagict |
8樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-2 10:12:00 [只看該作者]
用while無限循環Readfile,DEBUG口一直輸出mxs_spi_txrx_pio-R: timeout on waiting FIFO_EMPTY,用示波器看了下SPI四個接口的波形,只有MOSI是高電平,其他管腳都是低電平,沒有時鐘信號的樣子,我是在CN9的3~6測的,這是什么情況。
|
單帖管理 | 引用 | 回復 |
yy |
9樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-4 9:08:00 [只看該作者]
例程里是8bit的,你可能需要改成16bit的。
定義 private const int SSP_WORD_LENGTH_16BITS = 0xF; 然后后面 spiinit.eLength = SSP_WORD_LENGTH_16BITS; 而sSPI.BitCount是你要發送數據的長度,你確定是16嗎?還有波形有辦法發我郵箱下嗎?我郵箱yy@emtronix.com
|
單帖管理 | 引用 | 回復 |
jagict |
10樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-4 10:20:00 [只看該作者]
數據的長度指的是幾位還是幾個字節?波形就是MOSI管腳3V高電平,波形是正弦但相位不穩定,看起來像雙絞線,其他三個管腳都是低電平,波形沒有規律。還需要看圖片嗎
|
單帖管理 | 引用 | 回復 |
yy |
11樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-4 11:06:00 [只看該作者]
數據就是你要發送的數據的個數,如果填5,8bit就是5字節,16bit就是10字節。最后是有個波形給我們參考下。
[此貼子已經被作者于2013-11-4 11:51:59編輯過]
|
單帖管理 | 引用 | 回復 |
zxw |
12樓 |
Post By:2013-11-4 11:07:00 [只看該作者]
數據長度是指一次SPI通訊的數據位長度,一般是8位或16位,根據SPI從設備而定的。
MOSI管腳波形是正弦,就肯定不對了,應該是很好的方波才對,這里所有的信號都應該是方波:SCLK、MISO、MOSI、CS。
|
|
單帖管理 | 引用 | 回復 |
jagict |
13樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-4 11:23:00 [只看該作者]
那BitCount我就設置為16了? 指的是16位的數據而不是數據有16個字節?
四個管腳都不對那怎么排查問題呢?我上電后直接測量四個管腳的波形也都是正弦,這個對嗎?需要先配置IO嗎? 之前說要把DIN與OUT短接測下,但是我有外接電路怕出問題沒有試過。
|
單帖管理 | 引用 | 回復 |
yy |
14樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-4 11:54:00 [只看該作者]
修改下,前面說錯了,非常抱歉。BitCount的值為8或者16,分別表示8bits還是16bits。
有2個地方要修改 一個是SPIConfigure函數里的spiinit.eLength = SSP_WORD_LENGTH_16BITS; 一個是ReadFile或WriteFile時的SPI_INFO結構體sSPI.BitCount = 16; [此貼子已經被作者于2013-11-4 18:08:59編輯過]
|
單帖管理 | 引用 | 回復 |
jagict |
15樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-4 13:24:00 [只看該作者]
幫忙看一下配置吧,現在的波形沒什么指導意義,就是MOSI高電平正弦波形,其他低電平幾乎無信號。 主函數: hSPI = SPI.SPIOpen(); if... SPI.SPISetBandRate(hSPI, SPI.SPI_TRANSFER_HS_NORMAL_SPEED); TxBuffer[0] = 0xfc; //主機發送的數據_低8位 TxBuffer[1] = 0xf3; //主機發送的數據_高8位 sSPI.BitCount = 2; sSPI.pDatBuf = pTxBuffer; sSPI.dwDatLen = 2; sSPI.bLockCS = 0; Marshal.Copy(TxBuffer, 0, pTxBuffer, 2); bRes = SPI.WriteFile(hSPI, ref sSPI, sizeSPI, ref uLen, 0); if (!bRes)... sSPI.BitCount = 4; sSPI.pDatBuf = pRxBuffer; sSPI.dwDatLen = 10; sSPI.bLockCS = 1; while (true) { bRes = SPI.ReadFile(hSPI, ref sSPI, sizeSPI, ref uLen, 0); } SPI.CS文件: public static bool SPIConfigure(int hDevice) { int sizeSSP_INIT = Marshal.SizeOf(typeof(SSP_INIT)); SSP_INIT spiinit; spiinit.eMode = SSP_MODE_SPI; spiinit.eLength = SSP_WORD_LENGTH_16BITS; spiinit.bDmaEnable = 0; // 0: dma disabled, 1: dma enabled spiinit.b_ceata_ccs_err_en = 0; // CEATA Unexpected CCS Error logic enable. 0: disabled, 1: enabled spiinit.bPhase = 0; // SPI, MemStick, and SD modes spiinit.bPolarity = 0; // SPI, MemStick, and SD modes spiinit.bSlave = 0; // 0: SSP is Master, 1: SSP is Slave spiinit.bIgnoreCrc = 0; // Ignore the response CRC spiinit.bBusWidth4 = 0; // 0: 1-bit bus, 1: 4 bit bus spiinit.bWaitIrq = 0; spiinit.bLongResp = 0; // Get long response from device spiinit.bCheckResp = 0; // Check Response against reference to insure integrity of response spiinit.bGetResp = 0; // wait for a response spiinit.u16TransferCount = 0; spiinit.bEnable = 0; // Command Transmit Enable. spiinit.bWaitCmd = 0; // spiinit.bDataTransfr = 0; // Data Transfer Enable spiinit.bRead = 0; // Read Mode spiinit.bSlaveOutDisable = 0; // 0: SSP can drive MISO in slave mode, 1: SSP does not drive MISO spiinit.bHalfDuplex = 0; spiinit.bLockCs = 1; if (DeviceIoControl(hDevice, SPI_IOCTL_SSPCONFIGURE, ref spiinit, sizeSSP_INIT, null, 0, 0, IntPtr.Zero) == false) { return false; } return true; } |
單帖管理 | 引用 | 回復 |
jagict |
16樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-4 16:49:00 [只看該作者]
用你們的SPI例程運行,DEBUG輸出如下:
SPI_Opened SPI:-792216768 mxs_spi_txrx_pio-W: timeout on waiting CRTL0_RUN cleared mxs_spi_txrx_pio-R: timeout on waiting FIFO_EMPTY SPI_Opened SPI:-792216768說明SPI正確打開了嗎?是正確打開了才有后面那兩行嗎?
|
單帖管理 | 引用 | 回復 |
jagict |
17樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-4 17:02:00 [只看該作者]
有沒有最新的SPI測試程序,如果硬件沒有問題那就是測試程序的問題了,郵箱jagict@163.com
|
單帖管理 | 引用 | 回復 |
yy |
18樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-4 17:55:00 [只看該作者]
抱歉開始說錯了,我上面修改了,我測試了下程序.
修改SPI.cs spiinit.eLength = SSP_WORD_LENGTH_16BITS; 修改Program.cs TxBuffer[0] = 0xfc; TxBuffer[1] = 0xf3; TxBuffer[2] = 0x00; TxBuffer[3] = 0x00; TxBuffer[4] = 0x00; TxBuffer[5] = 0x00; TxBuffer[6] = 0x00; TxBuffer[7] = 0x00; TxBuffer[8] = 0x00; TxBuffer[9] = 0x00; sSPI.BitCount = 16; sSPI.pDatBuf = pTxBuffer; sSPI.dwDatLen = 1; sSPI.bLockCS = 0; Marshal.Copy(TxBuffer, 0, pTxBuffer, 10); bRes = SPI.WriteFile(hSPI, ref sSPI, sizeSPI, ref uLen, 0); 我看到的波形SPI_SCLK即CN9的3號腳輸出了16個脈沖。SPI_MOSI即CN9的4號腳是 11110011 11111100 正好是f3 fc說明是對了的。 程序發你郵箱了,波形圖不是太清楚 但是你應該能看出來。
[此貼子已經被作者于2013-11-4 18:39:21編輯過]
|
單帖管理 | 引用 | 回復 |
jagict |
19樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-5 9:16:00 [只看該作者]
太感謝了,問題有了重大進展,我也能看到波形了。不過writefile函數變成返回false,出現fail提醒,這是?
另外我循環readfile時又沒看到波形了,請教readfile時的配置是一樣的嗎?需要怎么寫才算成功讀到數據? 謝謝你們耐心的指導哈。 現在能看到readfile波形了,還是有fail提示,我的讀取配置如下: sSPI.BitCount = 16; sSPI.pDatBuf = pRxBuffer; sSPI.dwDatLen = 1; sSPI.bLockCS = 0; bRes = SPI.ReadFile(hSPI, ref sSPI, sizeSPI, ref uLen, 0); 收到的數據都是8位的ff,算是正確收到數據了嗎? 現在我設置sSPI.bLockCS = 1,可以讀取到一個數值了,我想應該算成功讀取了。現在的疑問只剩下writefile與readfile現在的返回值都為false,這是?
[此貼子已經被作者于2013-11-5 14:46:17編輯過]
|
單帖管理 | 引用 | 回復 |
yy |
20樓 信息 | 搜索 | 郵箱 |
加好友 發短信 |
Post By:2013-11-6 11:29:00 [只看該作者]
readfile返回false最大可能是你的hSPI句柄不對,你看下句柄是不是-1?
如果句柄是-1,可能你同時跑了2個程序,SPI已經打開過了,重復打開失敗,你試下把之前那個先關了。
|
單帖管理 | 引用 | 回復 |