OpenADSP社区

ADSP-EDU-BF53X开发板教学视频第五集--SPI和Timer及应用【Open ADSP开源社区】

0
阅读(3235)

Open ADSP开源社区的ADSP-EDU-BF53X开发板教学视频第五集,主要讲了一下Blackfin的SPI和Timer及应用。

http://player.youku.com/player.php/sid/XMjg3NDUwODM2/v.swf

 

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个通用定时器,每个定时器有三种模式:

  1. 脉冲宽度调制模式(PWM_OUT)
  2. 脉冲宽度计数捕获模式(WDTH_CAP)
  3. 外部事件模式(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&