主题:EM9280-SPI通信问题

  共有87203人关注过本帖    
帅哥哟,离线,有人找我吗?
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   [只看该作者]


刚看了这个AD器件,是一个14位的,你使用时,需要使用16位SPI数据通讯,请确认一下:
SPI.h中有一个定义:
#define UseBitCount16   0  //修改该定义为0或1,实现8位数据位或16位数据位通讯
把0改为1

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
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已经打开过了,重复打开失败,你试下把之前那个先关了。

  单帖管理 | 引用 | 回复 回到顶部

返回首页

EM9280-SPI通信问题

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: