您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF51X技术支持专区 -> BF518的SPI详解
本帖共有1185个阅读者
发表帖子 发表投票 回复主题
BF518的SPI详解
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF518的SPI详解

接口功能介绍

SPI 接口是4 线串口,可以连接SPIFLASH,SPI 接口的AD,DA 等等。ADSP-BF51x 上共有2 个SPI 接口。支持主机模式和从机模式,在主机模式下,可以通过SPISEL 接口挂载SPI 设备,支持在主机模式或从机模式下进行BOOT 启动。

SPI管脚定义

SPIx_MOSI :主输入从输出接口,根据主机和设备模式确定功能
SPIx_MISO :从输入主输出接口,根据主机和设备模式确定功能
SPIx_SCK :SPI 时钟
SPIx_SELx :SPI 设备选则接口
SPIx_SS :SPI从机片选接口

SPI 接口时钟最快可以到系统时钟的1/4,其配置公式为:
SCK Frequency = (Peripheral clock frequency SCLK)/(2 x SPI_BAUD)

接口寄存器说明

SPIx_CTL SPI :控制寄存器,配置SPI 工作模式及相位等
SPIx_FLG SPI :从机选择寄存器,用于选择使用哪一个片选控制设备
SPIx_STAT :SPI 状态寄存器,获取SPI 当前工作状态
SPIx_TDBR :SPI 数据传输寄存器
SPIx_RDBR :SPI 数据接收寄存器
SPIx_SHADOW :SPI_RDBR 的影子寄存器,可用于读取数据



我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/6/5 16:00:26
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

源码分析

*pSPI1_BAUD=2;                                                 //配置速率为1/4 系统时钟 SPI 速率 = SCLK/2*SPI_BAUD
*pSPI1_FLG |=FLS2;                                           //选择SPI1SEL2 接口
*pSPI1_CTL = 0x1001|CPHA| CPOL;                    //配置模式为手动片选模式
*pSPI1_CTL = (*pSPI_CTL | SPE);                      //使能SPI1 接口
*pSPI1_FLG &= ~FLG2;                                     //将SPI1SEL2 拉到0
while(!(*pSPI1_STAT & SPIF));                          //查看SPI1 传输状态是否完成
*pSPI1_TDBR = 0x55;                                         //将数据送入SPI1 传输数据寄存器
*pSPI1_FLG |= FLG2;                                         //将SPI1SEL2 拉到1,完成数据传输
*pSPI1_FLG &= ~FLG2;
while(*pSPI1_STAT & RXS)                                //查看SPI1 传输状态是否有数据需要接收
i = *pSPI1_RDBR; //读取数据
*pSPI1_FLG |= FLG2;

ADSP-BF51x 的SPI 接口支持手动片选和自动片选两种模式,通过SPIx_CTL 寄存器的CPHA 和CPOL 位配置。例子代码采用的是手动片选模式,每次读取数据和数据读取结束后需要通过代码来选通和关闭片选。

源码下载

上传的附件
   2012651625773.rar [ 797.86 KB ]

代码实现的功能

代码实现了采用 SPI1 接口发送0x55 数据和读取SPI1 接口数据。由于没有相关硬件为 SPI1 发送数据,所以代码只是为了学习SPI1 接口的使用,实现了读取和传输数据的功能,并不能查看发送数据和读取数据的结果。

运行结果

SPI1 接口发送数据0x55 后读取SPI1 接口数据。



我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/6/5 16:03:48
hu12huha(论坛新手)
hu12huha
头衔:社区公民
帮派:无帮无派
帖数:7
金钱:155
积分:9
注册时间:2014/1/10
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

还是不行啊。我用您给的例程试了下sck引脚的输出时钟一直是稳定在3.3v啊


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/1/12 15:07:58
hu12huha(论坛新手)
hu12huha
头衔:社区公民
帮派:无帮无派
帖数:7
金钱:155
积分:9
注册时间:2014/1/10
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我用的是您压缩包里给出的那个完整的程序

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/1/12 15:22:25
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你用的硬件是什么,检查硬件有没有问题

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/1/17 11:44:45
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我也试过了,真的是不行。硬件我用的是ADSP_BF518的核心板。

我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/5/27 17:25:53
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
代码是BF533上移植过来的,漏了端口功能设置,需要把BF51x上的相应端口功能配置为SPI功能

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/5/27 23:18:19
qiqi(论坛新手)
qiqi
头衔:社区公民
帮派:无帮无派
帖数:1
金钱:105
积分:1
注册时间:2015/10/14
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
请问SPI1不采用DMA模式可以用中断的方式收发数据吗?

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2015/10/18 15:43:54
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154121 Call, 1 Queries, Processed in 0.015625 second(s),