junyizhi 发表于 2012-3-2 21:05:15

求助各路大侠,BF531 SPI 如何读取数据有误 各路大仙小仙请留步

我用示波器抓到的数据已经给从机发送过去了 从机也返回了正确的波形数据。但是读取SPI_RDBR寄存器的 值却不是我要的数据跟 发上来的波形数据不一至。
是什么原因呢?有哪个碰到过吗?能否指点一二。请问手册上说的读取第一个数据忽略是怎么一回事 怎么实现忽略第一个数值后读取正确的数据。最好能给个范例;没有例子,给个建议也好,小弟在此谢过了,初用ADSP BF533,忘各路好汉 神仙搭救!调了好久都读取不到想要的正确的数据。苦恼中···

本人程序大概这样写的:(不知道哪里考虑不周,忘大家指出)
int16_t spi_rec(void)
{
        int16_t temp = 0;

        *pSPI_FLAG &= ~SPISEL1_VALUE;/*拉低片选*/
        /*在前面发送了地址和个数以后这里再向从机写一个数据为了是从机发送一个新的数据上来*/
        SPI_CTL &=0xfffc;
        SPI_CTL |=0x0001;/*TIMOD =01 Start transfer with write of SPI_TDBR, interrupt when SPI_TDBR is empty*/

        *pSPI_TDBR = 0XFFFF;
        while(!(*pSPI_STATE&SPI_STATE_SPIF))
        {
                ;/*等待发送完*/
        }
        if(SPI_STATE_RBSY == (*pSPI_STATE&SPI_STATE_RBSY))
        {
                *pSPI_STATE |= SPI_STATE_RBSY;/*写1清零错误位*/
        }

        SPI_CTL &=0xfffc; /*TIMOD =00 Start transfer with read of SPI_RDBR, interrupt whenSPI_RDBR is full*/

        temp = SPI_RDBR;

        *pSPI_FLAG |= SPISEL1_VALUE;/*拉高片选*/

        return temp;

}

int16_t spi_read(void)
{
        int16_t real_value = 0;

        spi_tx(addr);
        spi_tx(count);
        spi_rec();/*忽略第一读到的数据*/
        real_value = spi_rec();

        return real_value;
}

junyizhi 发表于 2012-3-2 21:20:05

回复【楼主位】junyizhi
-----------------------------------------------------------------------

http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723668R4WIDT.jpg
(原文件名:2012-3-2 21-15-21.jpg)

http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723669QHUW2S.jpg
(原文件名:2012-3-2 21-15-46.jpg)

http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723670S3ZN1W.jpg
(原文件名:2012-3-2 21-16-43.jpg)

astankvai 发表于 2012-3-3 09:15:36

你在SPI的读程序里边发送了一个0xFFFF,读回的数据就不是先前想的那个了。
SPI的读写是同步的。看SPI的时序。而且里的返回值是 SPI_RDBR,应该是*SPI_RDBR;
我不知道你是做从机还读SPI flash,如果是flash,就无所谓了。一般我的SPI读写函数是这样写的:
void SPI_WriteRead(unsigned short WriteData,unsigned short* Readdata)
{
   *pSPI_TDBR = 0XFFFF;
   标志判断
   return *SPI_RDBR;
}
我用在BF592里完全正常,供参考。

junyizhi 发表于 2012-3-3 20:29:09

谢谢 回复【2楼】astankvai 陈超
你在spi的读程序里边发送了一个0xffff,读回的数据就不是先前想的那个了。
spi的读写是同步的。看spi的时序。而且里的返回值是 spi_rdbr,应该是*spi_rdbr;
我不知道你是做从机还读spi flash,如果是flash,就无所谓了。一般我的spi读写函数是这样写的:
void spi_writeread(unsigned short writedata,unsigned short* readdata)
{
   *pspi_tdbr = 0xffff;
   标志判断
   return *spi_rdbr;
}
我用在bf592里完全正常,供参考。
-----------------------------------------------------------------------

谢谢您的回复,查看了一下,指针星号并没有漏掉。
我这是与FPGA 通讯的
想问一下
您这读写函数为什么不用在控制字里写后两位呢?就是操作它是发送还是接受TIMOD位域?不操作这两位也可以发送接受吗?
还有能否把你SPI初始化的也给看看呢?我用的是手动拉动片选,不知道是不是我初始化有问题呢
我初始化是SPI_STL=0x450c;

astankvai 发表于 2012-3-6 09:44:39

初始化0x450c是工作在从模式,没有使能MISO啊。
试下0x552c.

我的代码如下:
*pSPI0_BAUD = BAUD_RATE_DIVISOR;
*pSPI0_CTL = (SPE|MSTR|EMISO|CPHA |TIMOD01);

BYTE TransferByte( BYTE writevalue)
{
        *pSPI0_TDBR = writevalue;
        Wait_For_SPIF();
        return *pSPI0_RDBR;
}
这是针对BF592的,BF533只是寄存器名称不一样。
页: [1]
查看完整版本: 求助各路大侠,BF531 SPI 如何读取数据有误 各路大仙小仙请留步