ADSP-EDU-BF53X开发板教学视频第五集--SPI和Timer及应用【Open ADSP开源社区】
0赞Open ADSP开源社区的ADSP-EDU-BF53X开发板教学视频第五集,主要讲了一下Blackfin的SPI和Timer及应用。
3.5 BF53x_SPI
3.51 接口功能介绍
SPI接口是4线串口,可以连接SPIFLASH,SPI接口的AD,DA等等。ADSP-BF53x的SPI接口支持主机模式和从机模式,它有7个SPI从机片选,在主机模式下,它同时可以挂载7个SPI设备,还可以在主机模式或从机模式下进行BOOT启动。
SPI管脚定义:
|
管脚定义 |
功能 |
|
MOSI |
主输入从输出接口,根据主机和设备模式确定功能 |
|
MISO |
从输入主输出接口,根据主机和设备模式确定功能 |
|
SCK |
SPI时钟 |
|
SPISELx |
SPI设备选则接口 |
|
SPISS |
SPI从机片选接口 |
SPI接口时钟最快可以到系统时钟的1/4,其配置公式为:
SCK Frequency = (Peripheral clock frequency SCLK)/(2 x SPI_BAUD)
3.52 接口寄存器说明
|
寄存器 |
功能 |
|
SPI_CTL |
SPI控制寄存器,配置SPI工作模式及相位等 |
|
SPI_FLG |
SPI从机选择寄存器,用于选择使用哪一个片选控制设备 |
|
SPI_STAT |
SPI状态寄存器,获取SPI当前工作状态 |
|
SPI_TDBR |
SPI数据传输寄存器 |
|
SPI_RDBR |
SPI数据接收寄存器 |
|
SPI_SHADOW |
SPI_RDBR的影子寄存器,可用于读取数据 |
3.53 例子代码分析
*pSPI_BAUD=2; //配置速率为1/4系统时钟 SPI速率= SCLK/2*SPI_BAUD
*pSPI_FLG |=FLS2; //选择SPISEL2接口
*pSPI_CTL = 0x1001|CPHA| CPOL; //配置模式为手动片选模式
*pSPI_CTL = (*pSPI_CTL | SPE); //使能SPI接口
*pSPI_FLG &= ~FLG2; //将SPISEL2拉到0
while(!(*pSPI_STAT & SPIF)); //查看SPI传输状态是否完成
*pSPI_TDBR = 0x55; //将数据送入SPI传输数据寄存器
*pSPI_FLG |= FLG2; //将SPISEL2拉到1,完成数据传输
*pSPI_FLG &= ~FLG2; //将SPISEL2拉到0
while(*pSPI_STAT & RXS)//查看SPI传输状态是否有数据需要接收
i = *pSPI_RDBR; //读取数据
*pSPI_FLG |= FLG2; //将SPISEL2拉到1,完成数据传输
ADSP-BF53x的SPI接口支持手动片选和自动片选两种模式,通过SPI_CTL寄存器的CPHA和CPOL位配置,例子代码采用的是手动片选模式,每次读取数据和数据读取结束后需要通过代码来选通和关闭片选,自动片选的例子可以参考板卡驱动程序中的SD卡驱动代码。
3.54 代码实现功能
代码实现了采用SPI接口发送0x55数据和读取SPI接口数据。
由于没有相关硬件为SPI发送数据,所以代码只是为了学习SPI接口的使用,实现了读取和传输数据的功能,并不能查看发送数据和读取数据的结果。
3.55 测试结果
SPI接口发送数据0x55后读取SPI接口数据。
3.6 BF53x_Timer
3.61 接口功能介绍
ADSP-BF53x上有3个通用定时器,每个定时器有三种模式:
- 脉冲宽度调制模式(PWM_OUT)
- 脉冲宽度计数捕获模式(WDTH_CAP)
- 外部事件模式(EXT_CLK)
3.62 接口寄存器说明
|
寄存器 |
功能 |
|
TIMERx_CONFIG |
定时器配置寄存器,用于设置定时器工作模式 |
|
TIMERx_WIDTH |
定时器宽度寄存器,设置输出波形脉冲宽度 |
|
TIMERx_PERIOD |
定时器周期寄存器,设置输出波形的周期 |
|
TIMERx_COUNTER |
定时器计数寄存器,读取捕获的脉冲数量 |
|
TIMER_ENABLE |
定时器使能寄存器 |
|
TIMER_DISABLE |
定时器关闭寄存器 |
|
TIMER_STATUS |
定时器状态寄存器 |
3.63 例子代码分析
*pTIMER0_CONFIG = 0x0019; //配置定时器为PWM模式
*pTIMER0_PERIOD = 0x00800000; //设置周期为0x00800000个系统时钟
*pTIMER0_WIDTH = 0x00400000; //设置脉宽为0x00400000个系统时钟
*pTIMER_ENABLE = 0x0001; //使能Timer0
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffffff;
*pSIC_IAR2 = 0xfffffff4; //配置中断等级数据为4
register_handler(ik_ivg11, TIMER0_ISR); //注册中断等级为11,标识符为TIMER0_ISR
*pSIC_IMASK = 0x00010000;
EX_INTERRUPT_HANDLER(TIMER0_ISR) //标识符为TIMER0_ISR的中断函数
{
*pTIMER_STATUS = 0x0001; //清除定时器中断标志
printf("timer0 interrupt !\n"); //打印信息
}
3.64 代码实现功能
代码实现了将定时器配置为PWM_OUT模式,通过定时器中断来定时一个0x00800000个系统的时间长度,定时完成后,在中断内打印信息。
定时器没有单独的计时功能,所以如果计时,可以采用PWM_OUT模式,利用定时器中断来进行计时,同时在芯片的TIMER0管脚上,会有PWM波形输出。
3.65 测试结果

优酷链接:http://v.youku.com/v_show/id_XMjg3NDUwODM2.html
清晰版下载地址:http://u.115.com/file/dn685c6b 如需提取码,则是:dn685c6b
板卡链接:http://item.taobao.com/item.htm?spm=1103Qmdt.3-3dfNy.h-1Akvus&id=9026190872&
