主题:EM9280-SPI通信问题 共有87210人关注过本帖 |
---|
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,请大家帮忙,暂时无示波器看波形。
|
单帖管理 | 引用 | 回复 |
jagict |
2楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2013-11-1 17:28:00 [显示全部帖子]
板子是烧写wince系统的,我试试能不能成功,没有短接的话例子程序也是一样的输出信息。
|
单帖管理 | 引用 | 回复 |
jagict |
3楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
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 |
4楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
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测的,这是什么情况。
|
单帖管理 | 引用 | 回复 |
jagict |
5楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2013-11-4 10:20:00 [显示全部帖子]
数据的长度指的是几位还是几个字节?波形就是MOSI管脚3V高电平,波形是正弦但相位不稳定,看起来像双绞线,其他三个管脚都是低电平,波形没有规律。还需要看图片吗
|
单帖管理 | 引用 | 回复 |
jagict |
6楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2013-11-4 11:23:00 [显示全部帖子]
那BitCount我就设置为16了? 指的是16位的数据而不是数据有16个字节?
四个管脚都不对那怎么排查问题呢?我上电后直接测量四个管脚的波形也都是正弦,这个对吗?需要先配置IO吗? 之前说要把DIN与OUT短接测下,但是我有外接电路怕出问题没有试过。
|
单帖管理 | 引用 | 回复 |
jagict |
7楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
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 |
8楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
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 |
9楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2013-11-4 17:02:00 [显示全部帖子]
有没有最新的SPI测试程序,如果硬件没有问题那就是测试程序的问题了,邮箱jagict@163.com
|
单帖管理 | 引用 | 回复 |
jagict |
10楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
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编辑过]
|
单帖管理 | 引用 | 回复 |
jagict |
11楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2013-11-6 14:29:00 [显示全部帖子]
不是负1,是个数值15025411,读取应该算成功了怎么还返回false呢?你给的程序也是。
|
单帖管理 | 引用 | 回复 |
jagict |
12楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2013-11-21 10:39:00 [显示全部帖子]
我已经收到数值了,RxBuffer[0]和RxBuffer[1]都有可变的数值,说明通信成功也不是悬空的,还是返回false呢。
|
单帖管理 | 引用 | 回复 |
jagict |
13楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2013-11-22 10:33:00 [显示全部帖子]
好的,多谢。
|
单帖管理 | 引用 | 回复 |