您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [原创]518的SPI和ADC芯片通信完成模数转换问... 
本帖共有805个阅读者
发表帖子 发表投票 回复主题
[原创]518的SPI和ADC芯片通信完成模数转换问题。
Ling_Zero00(论坛新手)
Ling_Zero00
头衔:社区公民
帮派:无帮无派
帖数:37
金钱:436
积分:50
注册时间:2014/9/16
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[原创]518的SPI和ADC芯片通信完成模数转换问题。
请问518的SPI1和ADC芯片通信完成模数转换,必须要开启SPI1 status的中断吗?我采样结果有输出,但是输出结果和模拟输入信号的直流电压值差别很大,调了很久不知道什么原因。

ADSP
等级:论坛新手 参考IP地址:*.*.*.*
2014/11/4 17:26:55
Ling_Zero00(论坛新手)
Ling_Zero00
头衔:社区公民
帮派:无帮无派
帖数:37
金钱:436
积分:50
注册时间:2014/9/16
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我的收发函数有没有问题呢?
unsigned short Red_data(unsigned short byte)
{
    unsigned short iTest=0;
    
//    del(Ti);
    
    *pSPI1_FLG = 0x0102;
    del(Ti);
    while(!(*pSPI1_STAT & SPIF));//判断是否传输完毕
    *pSPI1_TDBR = byte;                //要发送的数据                
    while(!(*pSPI1_STAT & RXS));        //判断是否有要读的数据
//    del(Ti);
    delay(Tim);
    iTest = *pSPI1_RDBR;            //将读寄存器中的数赋给变量
    del(Ti);
    *pSPI1_FLG = 0x0302;
    return iTest;
    
}

ADSP
等级:论坛新手 参考IP地址:*.*.*.*
2014/11/5 11:13:57
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
不一定要开中断,通常AD都有一个状态忙管脚,找个IO连接,感知当前AD状态,当AD不忙的话,就读数据。当然,有的则是通过SPI读取AD的状态寄存器判断状态,两种选其1即可。
你的代码逻辑有点问题,发送数据时,应先将数据填入FIFO,然后用while 死等,等待传输完成。接着判断是否有新的数据要读取,读取数据时不能死等,仅仅是判断一下是否有,有的话,读取FIFO数据,没有就退出收发函数。
你到我们网站上,下载专区里,把那个BF533下触摸屏的代码下下来参考一下。
另外SPI有4种时序,你要根据你的AD,匹配好使用哪一种,具体看SPI控制寄存器的CPOL和CPHA位说明。
SPI片选有自动和手动,手动时,片选产生也要和你的AD匹配。
你先把SPI收发数据的波形配的和AD手册要求的一致,再读取AD一个已知的寄存器,看是否能读取正确。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/11/5 21:48:51
Ling_Zero00(论坛新手)
Ling_Zero00
头衔:社区公民
帮派:无帮无派
帖数:37
金钱:436
积分:50
注册时间:2014/9/16
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
好的,很受用,谢谢Andy。

ADSP
等级:论坛新手 参考IP地址:*.*.*.*
2014/11/5 22:00:14
Ling_Zero00(论坛新手)
Ling_Zero00
头衔:社区公民
帮派:无帮无派
帖数:37
金钱:436
积分:50
注册时间:2014/9/16
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我看了一下
“ADSP-EDU-BF53x V2.1 触摸屏无噪点代码”代码中的读写函数:
unsigned char spi_byte_rw(unsigned char value)
{
    unsigned char incoming=0;    
    while(!(*pSPI_STAT & SPIF));
    *pSPI_TDBR = value;
    while(*pSPI_STAT & RXS)
    incoming = *pSPI_RDBR;
    return(incoming);    
}
也是在写数据之前死等待,再写数据。
我改了一下:
unsigned short Red_data(unsigned short byte)
{
    unsigned short iTest=0;
    *pSPI1_FLG = 0x0102;
    del(Ti);
    *pSPI1_TDBR = byte;    
    while(!(*pSPI1_STAT & SPIF));//是否发送完毕
                    
    //判断是否传输完毕            
    if(*pSPI1_STAT & RXS){      //判断是否有要读的数据
        
        iTests= *pSPI1_RDBR;    //将读寄存器中的数赋给变量    
        
    }    
    delay(Tim);
    *pSPI1_FLG = 0x0302;
    return iTest;
    
}

ADSP
等级:论坛新手 参考IP地址:*.*.*.*
2014/11/5 22:32:00
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
发送数据肯定要等数据FIFO为空,但接受数据不能死等,有的话收,没有就跳过。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/11/12 22:14:01
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159286 Call, 1 Queries, Processed in 0.031250 second(s),