您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 求助BF533/BF531的SPI的 程序
本帖共有817个阅读者
发表帖子 发表投票 回复主题
求助BF533/BF531的SPI的 程序
zhoumaicheng(论坛新手)
zhoumaicheng
头衔:社区公民
帮派:无帮无派
帖数:29
金钱:464
积分:54
注册时间:2012/7/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
求助BF533/BF531的SPI的 程序

int main()
{
int i;
Set_PLL(16,3);
Init_EBIU();

SPI_init();

*pSPI_FLG &= ~FLG2;  //将SPISEL2拉到0
while(!(*pSPI_STAT & SPIF)) ;//查看SPI传输状态是否完成
*pSPI_TDBR = 0x55;      //将数据送入SPI传输数据寄存器


*pSPI_FLG |= FLG2;    //将SPISEL2拉到1,完成数据传输



*pSPI_FLG &= ~FLG2;  
while(*pSPI_STAT & RXS)//查看SPI传输状态是否有数据需要接收
i = *pSPI_RDBR; //读取数据
*pSPI_FLG |= FLG2;  


while(1);  
}*pSPI_TDBR = 0x55;      //将数据送入SPI传输数据寄存器

对于上面这个 函数,我通过 单步 运行,运行到这一步的 时候*pSPI_TDBR = 0x55;      //将数据送入SPI传输数据寄存器,我发现SPI_STAT寄存器由原来的0001变成了0021,SPI_TDBR变成了0055,SPI_RDBR变成了00FF,当运行到这一步的时候*pSPI_FLG |= FLG2;    //将SPISEL2拉到1,完成数据传输

我的疑问

1,为什么我给SPI_TDBR赋值后,寄存器SPI-STAT为什么会变成0021呢?这个 0021说明了此时SPI_RDBR已经 full,所以我查看SPI_RDBR,,意外发现这个 寄存器竟然莫名其妙的变成了00FF,这是为什么 呢,感觉 很 奇怪,而且后面你 读寄存器SPI_RDBR,读到的值就 是 00ff,难道我给SPI-TDBR赋值的时候,衣 会影响SPI-RDBR这个寄存器

2,原来SPI-STAT是0001,表示数据 已经 发送 完毕,没有 可以 发送的数据了,我现在给 寄存器赋值0055,紧接着执行了*pSPI_FLG |= FLG2;    //将SPISEL2拉到1,完成数据传输,那么意味着数据传输完毕,寄存器SPI_STAT是0021,我理解,那么,当没执行*pSPI_FLG |= FLG2;    //将SPISEL2拉到1,完成数据传输,这一步的时候,意味着数据没有传输完成,为什么寄存器的值不是0000呢,为什么还是0021?






喜欢学习
等级:论坛新手 参考IP地址:*.*.*.*
2012/7/21 16:17:37
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

1. SPI 接收时,需要时钟来接收数据,这个时钟是有主机给的。当初始化完SPI寄存器后,SPI接口就处于随时接收数据状态。当你发送数据时,SPI接口产生了时钟,这个时钟将数据发送出去的同时,也将MISO上的数据收了回来,由于MISO此时为高电平,所以收到的数据为0xff。

while(*pSPI_STAT & RXS)//查看SPI传输状态是否有数据需要接收
i = *pSPI_RDBR; //读取数据

这个操作并不会使SPI接收数据,仅仅是将FIFO 中的数据读取,因为没有SPI时钟的参与。你可以看看其他SPI的应用例子,所有的接收数据都会伴随着发送数据,目的就是为了产生接收数据的时钟,而不是你读取FIFO才开始接收数据。

2. SPI 发送数据完成后,状态寄存器随即就更新,不会等待片选拉高。将片选拉高仅仅是匹配时序,在物理上的一次传输数据结束。在连续传输时,有时需要片选始终为低,直到所以数据传输完成才拉高。这个时候,如果状态寄存器等待片选,将不能实现连续的传输。



这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/7/21 21:33:13
zhoumaicheng(论坛新手)
zhoumaicheng
头衔:社区公民
帮派:无帮无派
帖数:29
金钱:464
积分:54
注册时间:2012/7/10
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
ANDY,太感谢你了,每次你都  能 把百思不 解的 问题 ,回答 的 通俗易懂,太 谢谢 你 了

喜欢学习
等级:论坛新手 参考IP地址:*.*.*.*
2012/7/21 22:57:35
taotaost(论坛新手)
taotaost
头衔:社区公民
帮派:无帮无派
帖数:16
金钱:244
积分:24
注册时间:2012/3/17
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

只有在发送数据时才会产生时钟吗?


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/8/9 17:18:54
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线


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