打印

5409的MCBSP配置成SPI口的小节

[复制链接]
3442|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guoxuekun|  楼主 | 2008-8-22 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

终于把5409的McBSP的配置搞清楚了!现在就把我做的写出来,也好让后来人在这方面少走弯路。我的目标是将MCBSP配置成SPI兼容接口。
        我采用MCBSP0。  下面我把我用汇编写的McBSP的初始化程序给出来。已经调试通过了,但是可能还有不对的地方,请大家看了以后指正!
                .include        "cpu_reg.inc"
                .def            McBsp0Init
McBsp0Init:                     
                stm             #spcr10,spsa0   ;接收复位
                stm             #0000h,spsd0    
                
                stm     #spcr20,spsa0   
                stm     #0000h,spsd0    ;发送复位
                rpt             #9
                nop
                STM             #spcr10,spsa0
                STM             #1800h,spsd0    ;clkstp=11b
*---------------------------PCR0------------------------------------            
                stm             #pcr0,spsa0      ;CLKXP=0,CLKXM=1,FSXM=1,FSXP=1
                                ;xx..............;RESERVED
                                ;..0.............;XIOEN=0时,DS,FSX,CLKX配置为串行接口
                                ;...0............;RIOEN=0时,DR,FSR,CLKR,CLKS配置为串行接口引脚
                                ;....1...........;FSXM=1时,采样率发生器的帧同步模式位(SRGR2的FSGM位)决定帧同步信号
                                ;.....0..........;FSRM=1,片内采样率发生器产生帧同步信号,FSR为输出引脚(除非SRGR的GSYNC=1)
                                ;......1.........;在SPI模式下,CLKXM=1时,McBSP为主设备,并产生时钟(CLKX)
                                                                        ;去驱动它的接收时钟(CLKR)和系统的SPI从设备的SCLK时钟
                                ;.......1........;DLB=0时,
                                                                        ;CLKRM=0,接收时钟由外部时钟驱动
                                                                        ;CLKRM=1,接收时钟由内部采样率发生器驱动
                                                                 ;DLB=1时,
                                                                        ;CLKRM=0,接收时钟由发送时钟驱动,CLKX的特性由PCR的CLKXM位
                                                                        ;设定。CLKR引脚为高阻态
                                                                        ;CLKRM=1,CLKR为由发送时钟(CLKX)驱动的输出引脚。CLKX的特性由PCR的CLKXM位
                                                                        ;设定。
                                ;........x.......;RESERVED,
                                ;.........x......;CLKS引脚状态位。当CLKS被选作通用输入时,该位反映了CLKX引脚的值
                                ;..........x.....;DX引脚状态位
                                ;...........x....;DR引脚状态位
                                ;............1...;帧同步脉冲FSX低电平有效
                                ;.............0..;帧同步脉冲FSR低电平有效
                                ;..............0.;发送时钟极性,CLKXP=0时,在CLKX的上升沿采样发送数据
                                ;...............0;接收时钟极性,CLKRP=0时,在CLKR的上升沿采样发送数据
                stm             #0b08h,spsd0
*-------------------SRGR20-----------------------------------           
                stm             #srgr20,spsa0
                                ;0...............;GSYNC=0,采样率发生寄存器时钟(CLKG)自由运行
                                ;.0..............;CLKSP=0,在CLKS的上升沿产生CLKG和FSG
                                ;..1.............;CLKSM=1,采样率发生器时钟由CPU时钟驱动
                                ;...0............;FSGM=0,当DXR复制到XSR而产生发送帧同步信号(FSX)
                                                                        ;FSGM=0时,FPER和FWID均被忽略
                                ;....xxxxxxxxxxxx;FPER,帧周期
                stm             #2000h,spsd0    ;clksm=1,fsgm=0
*--------------------SRGR10----------------------------------           
                stm             #srgr10,spsa0   ;DSP时钟为60MHz,MBF200为12MHz
                                ;xxxxxxxx........;FWID,帧宽度
                                ;........00110000;CLKDV=48,采样率发生时钟除法器
                stm             #0030h,spsd0    ;clkgdv=30h,SPI的时钟=DSP时钟/48
                                                                ;=1MHz
                nop
                nop
*----------------------RCR10----------------------------------          
                stm             #rcr10,spsa0    
                                ;x...............;RESERVED
                                ;.0000000........;RFLEN1=000 0000,每帧1字
                                ;........100.....;RWDLEN1=100,每字24bit
                                ;...........xxxxx;RESERVED
                stm             #0080h,spsd0    
*---------------------RCR20------------------------------------         
                stm             #rcr20,spsa0
                                ;0...............;RPHASE=0,单相帧
                                ;.0000000........;RFLEN2=000 0000,每帧1字
                                ;........100.....;RWDLEN2=100,每个字24bit
                                ;...........00...;RCOMPAND=00,无扩展,数据传送从最高位(msb)开始
                                ;.............0..;RFIG=0,第一个后的接收帧同步脉冲重新启动数据传送
                                ;..............01;RDATDLY=01,延迟一位数据
                stm             #0081h,spsd0    ;rdatdly=01
*-------------------------XCR10----------------------------------               
                stm             #xcr10,spsa0            ;发送
                                ;x...............;reserved
                                ;.0000000........;XFRLEN1=000 0000,每帧1字
                                ;........100.....;XWDLEN1=100,每字24bit
                                ;...........XXXXX;RESERVED
                stm             #0080h,spsd0    ;
*-------------------------XCR20----------------------------------               
                stm             #xcr20,spsa0            ;发送
                                ;0...............;XPHASE=0,单相帧
                                ;.0000000........;XFLEN2=000 0000,每帧1字
                                ;........100.....;XWDLEN2=100,每字24bit
                                ;...........00...;XCOMPAND=00,无扩展,数据传输从最高位(MSB)开始
                                ;.............0..;SFIG=0,第一个后的发送帧同步脉冲重新启动数据传送
                                ;..............01;XDATDLY=01,延迟一位数据
                stm             #0081h,spsd0    
*-----------------------SPCR20----------------------------------------
                STM             #spcr20,spsa0
                STM             #0040h,spsd0    ;grst=1         
                rpt             #9
                nop                                     ;等待
*---------------------------SPCR10---------------------------------------
                stm             #spcr10,spsa0   ;RINTM=10
                                ;0...............;DLB=0,禁止循环返回
                                ;.00.............;RJUST=00,DRR靠右对齐,高位补0
                                ;...11...........;CLSTP=11,时钟停止模式,有延时
                                ;.....xxx........;RESERVED
                                ;........0.......;DXENA=0,DX使能关
                                ;.........0......;ABIS=0,禁止ABIS模式
                                ;..........10....;RINTM=10,接收中断RINT由一个新的帧同步信号产生
                                ;............0...;RSYNCERR=0,无接收同步错误
                                ;.............0..;RFULL=0,RBR没有出现上溢
                                ;..............0.;RRDY=0,接收器没有准备好
                                ;...............1;RRST=1,打开串口接收
                stm     #9821h, spsd0   
                rpt             #9
                nop
*----------------------------SPCR20----------------------------------
                stm     #spcr20,spsa0   
                                ;xxxxxx..........;RESERVED
                                ;......0.........;FREE=1,时钟自由运行
                                ;.......0........;SOFT=0,禁止SOFT模式
                                ;........0.......;FRST=0,帧同步逻辑电路复位。采样率发生器不会产生帧同步信号FSG
                                ;.........1......;GRST=1,采样率发生器从复位中退出。CLKG按照采样率发生寄存器
                                                                 ;(SRGR)中的编程值产生时钟信号
                                ;..........10....;XINTM=10,发送中断XINT由一个新的帧同步信号产生
                                ;............0...;XSYNCERR=0,无发送帧帧同步错误
                                ;.............0..;XEMPTY=0,XSR为空
                                ;..............0.;XRDY=0,发送器未准备好
                                ;...............1;XRST=1,打开串口发送
                stm     #0061h,spsd0    
                rpt             #9
                nop
                stm             #spcr20,spsa0   ;FRST=1
                orm             #0080h,spsd0
                rpt             #6
                nop
                ret
,本贴地址:http://www.hellodsp.com/bbs/viewthread.php?tid=9037



相关帖子

来自 2楼
hotpower| | 2008-8-22 20:43 | 只看该作者

哈哈~~~任何SPI都有4种模式~~~还是C语言看着舒服~~~


搜索"C5402def.h"看看~~~简单明了~~~
虽然C5402cfg.h/c5402cfg.c"更强大,俺暂不想发布~~~

void McBSPObj::McBSP0Init(void)//McBSP从设备SPI硬件配置
{
/*-------------------------------------------------------------
  DSP5402之McBSP从设备SPI硬件四种模式配置实例(经过硬件测试)
--------------------------------------------------------------*/
//PCR设置过程(FSM=0,CLKM=0)
  McBSP0->SPSA = PCR;
  McBSP1->SPSD = (0 << PCR_XIOEN)   //发送非通用I/O模式位
               | (0 << PCR_RIOEN)   //接收非通用I/O模式位
               | (0 << PCR_FSXM)  //外部发送帧同步脉冲(外部片选)
               | (0 << PCR_FSRM)  //外部接收帧同步脉冲(外部片选)
               | (0 << PCR_CLKXM) //外部发送时钟(外部时钟源)
               | (0 << PCR_CLKRM) //外部接收时钟(外部时钟源)
#if SPIMODE == 0               
//SPI设置过程00(0--FS高电平有效,0--CLK上升沿收发数据)

               | (0 << PCR_FSXP)  //发送帧同步脉冲极性(高电平有效)
               | (0 << PCR_FSRP)  //接收帧同步脉冲极性(高电平有效)
               | (0 << PCR_CLKXP) //发送时钟极性(上升沿发送数据)
               | (0 << PCR_CLKRP);//接收时钟极性(上升沿接收数据)
#endif
#if SPIMODE == 1
//SPI设置过程01(0--FS高电平有效,1--CLK下降沿收发数据)
               | (0 << PCR_FSXP)  //发送帧同步脉冲极性(高电平有效)
               | (0 << PCR_FSRP)  //接收帧同步脉冲极性(高电平有效)
               | (1 << PCR_CLKXP) //发送时钟极性(下降沿发送数据)
               | (1 << PCR_CLKRP);//接收时钟极性(下降沿接收数据)
#endif
#if SPIMODE == 2
//SPI设置过程10(1--FS低电平有效,0--CLK上升沿收发数据)
               | (1 << PCR_FSXP)  //发送帧同步脉冲极性(低电平有效)
               | (1 << PCR_FSRP)  //接收帧同步脉冲极性(低电平有效)
               | (0 << PCR_CLKXP) //发送时钟极性(上升沿发送数据)
               | (0 << PCR_CLKRP);//接收时钟极性(上升沿接收数据)
#endif
#if SPIMODE == 3
//SPI设置过程11(1--FS低电平有效,1--CLK下降沿收发数据)
               | (1 << PCR_FSXP)  //发送帧同步脉冲极性(低电平有效)
               | (1 << PCR_FSRP)  //接收帧同步脉冲极性(低电平有效)
               | (1 << PCR_CLKXP) //发送时钟极性(下降沿发送数据)
               | (1 << PCR_CLKRP);//接收时钟极性(下降沿接收数据)
#endif
//MCR1设置过程(RMCM=0)
  McBSP0->SPSA = MCR1;//
  McBSP0->SPSD = (0 << MCR1_RMCM) //允许接收多通道选择(0)
               | (0x00 << MCR1_RPBBLK)
               | (0x00 << MCR1_RPABLK)
               | (0x00 << MCR1_RCBLK);
//MCR2设置过程(XMCM=0)
  McBSP0->SPSA = MCR2;//
  McBSP0->SPSD = (0x00 << MCR2_XMCM) //允许发送多通道选择(00b)
               | (0x00 << MCR2_XPBBLK)
               | (0x00 << MCR2_XPABLK)
               | (0x00 << MCR2_XCBLK);

//RCERA设置过程
  McBSP0->SPSA = RCERA;//
  McBSP0->SPSD = 0;

//RCERB设置过程
  McBSP0->SPSA = RCERB;//
  McBSP0->SPSD = 0;

//XCERA设置过程
  McBSP0->SPSA = XCERA;//
  McBSP0->SPSD = 0;

//XCERB设置过程
  McBSP0->SPSA = XCERB;//
  McBSP0->SPSD = 0;

//XCR1设置过程
  McBSP0->SPSA = XCR1;//
  McBSP0->SPSD = (0x00 << XCR1_XFRLEN1) //每帧1个字(每帧中断的次数1!!!)
//               | (0x02 << XCR1_XWDLEN1);//每字16位长(每次中断的字节数2!!!)
               | (0x00 << XCR1_XWDLEN1);//每字8位长(每次中断的字节数2!!!)
//XCR2设置过程
  McBSP0->SPSA = XCR2;
  McBSP0->SPSD = (0 << XCR2_XPHASE) //单相帧(其他设置都为0)
               | (0x00 << XCR2_XCOMPAND)//发送数据从最高位(MSB)开始
               | (0x00 << XCR2_XDATDLY);//同步后延迟0位数据
//RCR1设置过程
  McBSP0->SPSA = RCR1;               
  McBSP0->SPSD = (0x00 << RCR1_RFRLEN1) //每帧1个字(每帧中断的次数1!!!)
//               | (0x02 << RCR1_RWDLEN1);//每字16位长(每次中断的字节数2!!!)
               | (0x00 << RCR1_RWDLEN1);//每字8位长(每次中断的字节数2!!!)
//RCR2设置过程
  McBSP0->SPSA = RCR2;               
  McBSP0->SPSD = (0 << RCR2_RPHASE) //单相帧(其他设置都为0)
               | (0x00 << RCR2_RCOMPAND)//接收数据从最高位(MSB)开始
               | (0x00 << RCR2_RDATDLY);//同步后延迟0位数据
//SRGR1设置过程
  McBSP0->SPSA = SRGR1;
  McBSP0->SPSD = (0x00 << SRGR1_CLKGDV);//1
//SRGR2设置过程
  McBSP0->SPSA = SRGR2;
  McBSP0->SPSD = (0 << SRGR2_FSGM) 
               | (1 << SRGR2_CLKSM)//由CPU时钟产生的采样率时钟1
               | (0 << SRGR2_CLKSP)//0
               | (1 << SRGR2_GSYNC)//
               | (0x0f << SRGR2_FPER);//0x0f
//SPCR1设置过程(CLKSTP=1Xb,RINTM=00b)
  McBSP0->SPSA = SPCR1;
  McBSP0->SPSD = (0x00 << SPCR1_RINTM)  //接收中断模式00(每帧接收1次中?
                             | (0 << SPCR1_DLB)       //禁止回送
               | (1 << SPCR1_DXENA)     //DX使能
               | (0x00 << SPCR1_RJUST)  //接收符号不扩展
               | (0x02 << SPCR1_CLKSTP);//SPI模式时钟开始于上升沿(无延迟)
//SPCR2设置过程(XINTM=02b)
  McBSP0->SPSA = SPCR2;
  McBSP0->SPSD = (0x02 << SPCR2_XINTM)//发送中断模式02
               | (1 << SPCR2_XEMPTY)  //发送移位寄存器空
               | (1 << SPCR2_XRDY);   //发送准备好
//SPCR1复位过程
  McBSP0->SPSA = SPCR1;
  McBSP0->SPSD|= (1 << SPCR1_RRST);//接收器复位
//SPCR2复位过程
  McBSP0->SPSA = SPCR2;
  McBSP0->SPSD|= (1 << SPCR2_XRST)//发送器复位
               | (1 << SPCR2_GRST)//采样率发生器复位
               | (1 << SPCR2_FRST);//帧同步发生器复位
//清除允许BXINT0中断过程
//  SREG->IFR = (1 << IFR_BXINT0);//清除BXINT0中断标志
//  SREG->IMR |= (1 << IMR_BXINT0);//允许BXINT0中断
//清除允许BRINT0中断过程
  SREG->IFR = (1 << IFR_BRINT0);//清除BRINT0中断标志
  SREG->IMR |= (1 << IMR_BRINT0);//允许BRINT0中断
}   

void McBSPObj::McBSP1Init(void)//GPIO配置
{
  McBSP1->SPSA = SPCR1;
  McBSP1->SPSD = 0;
  McBSP1->SPSA = SPCR2;
  McBSP1->SPSD = 0;
  McBSP1->SPSA = PCR;
//设置收发为IO接口,DX输出,DR,CLKS输入  
  McBSP1->SPSD = (1 << PCR_RIOEN)   //通用I/O模式位
//硬件RDDOG喂狗信号(BDX1)管脚输出模式默认I/O设置
               | (1 << PCR_XIOEN)   //通用I/O模式位
//硬件RD SIA信号(BFSR1)管脚输入模式设置               
               | (0 << PCR_FSRM)    //FSR为输入IO
//硬件FM CE信号(BFSX1)管脚输出模式设置               
               | (1 << PCR_FSXM)    //FSR为输出IO,FLASH的片选信号
//硬件FM CE信号(BFSX1)管脚高电平输出控制
               | (1 << PCR_FSXP)    //关闭FLASH的片选信号(FSX=1)
               | (0 << PCR_CLKRM)   //CLKR为输入IO
               | (0 << PCR_CLKXM);  //CLKX为输入IO,CLKX信号
}
转载请注明出自DSP交流网 DSP学习第一论坛 DSP技术应用与推广平台 DSP开发服务平台 http://www.hellodsp.com/bbs/,本贴地址:http://www.hellodsp.com/bbs/viewthread.php?tid=9036




相关链接:http://blog.**/hotpower/149032/message.aspx

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

53

帖子

0

粉丝