打印

mcbsp配置成SPI主动模式读取串行AD采样数据

[复制链接]
1721|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
spark周|  楼主 | 2016-9-16 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
高手帮忙看看,mcbsp配置成SPI主动模式读取串行AD采样数据。谢谢

void InitMcbsp(void)
{
   EALLOW;
McbspaRegs.SPCR2.all=0x0000;  // Reset FS generator, sample rate generator & transmitter
McbspaRegs.SPCR1.all=0x0000;  // Reset Receiver, Right justify word
McbspaRegs.MFFINT.all=0x0;   // Disable all interrupts
     McbspaRegs.MFFST.all=0x0;     // Clear all status bits
     McbspaRegs.SPCR1.bit.CLKSTP=2;     
     McbspaRegs.PCR.bit.CLKXP=0;    //发送数据在上升沿
     McbspaRegs.PCR.bit.CLKRP=0;    //接收数据在下降沿
     McbspaRegs.PCR.bit.CLKXM=1;   //CLKX设置为输出,SPI工作在主动模式
     delay_loop();
     McbspaRegs.PCR.bit.SCLKME=0;   
    McbspaRegs.SRGR2.bit.CLKSM=1;  //选择采样速率发生器输入时钟源
     McbspaRegs.SRGR1.bit.CLKGDV=0x03;     
     McbspaRegs.PCR.bit.FSXM=1;       //FSX为输出引脚
     McbspaRegs.SRGR2.bit.FSGM=0;//采样速率器帧同步信号驱动发送帧同步信号
     McbspaRegs.PCR.bit.FSXP=1;      //FSX低电平有效
     
    McbspaRegs.XCR2.bit.XDATDLY=1;  //发送一位延时
     McbspaRegs.RCR2.bit.RDATDLY=1;  //接收一位延时
     
    McbspaRegs.XCR2.bit.XPHASE=0;  //发送使用单相位帧
     McbspaRegs.RCR2.bit.RPHASE=0;  //接收使用单相位帧
     
    McbspaRegs.XCR1.bit.XFRLEN1=0; //发送帧长度为一个串行字
     McbspaRegs.RCR1.bit.RWDLEN1=0; //接收帧长度为一个串行字
     
    McbspaRegs.XCR1.bit.XWDLEN1=2; //发送字长度为16位
     McbspaRegs.RCR1.bit.RWDLEN1=2; //接收字长度为16位      
                 
    McbspaRegs.SPCR2.bit.GRST=1;   //复位采样速率生成器
     clkg_delay_loop();                  // Wait at least 2 CLKG cycles
McbspaRegs.SPCR2.bit.XRST=1;        // Release TX from Reset
McbspaRegs.SPCR1.bit.RRST=1;        // Release RX from Reset
clkg_delay_loop();                  // Wait at least 2 CLKG cycles
McbspaRegs.SPCR2.bit.FRST=1;        // Frame Sync Generator reset

}

void InitAdc(void)
{
   InitMcbsp();
   
while(McbspaRegs.SPCR2.bit.XRDY!=1);
McbspaRegs.DXR1.all=0xA000;
while(McbspaRegs.SPCR1.bit.RRDY!=1);
Adcresult[0]=McbspaRegs.DRR1.all;

while(McbspaRegs.SPCR2.bit.XRDY!=1);
McbspaRegs.DXR1.all=0xC000;;
while(McbspaRegs.SPCR1.bit.RRDY!=1);
Adcresult[0]=McbspaRegs.DRR1.all;

while(McbspaRegs.SPCR2.bit.XRDY!=1);
McbspaRegs.DXR1.all=0x9C18;;
while(McbspaRegs.SPCR1.bit.RRDY!=1);
Adcresult[0]=McbspaRegs.DRR1.all;

}


void delay_loop(void)     // Delay function used while initializing the registers
{
     long      i;
     for (i = 0; i<4; i++);
}
void clkg_delay_loop(void)
{
     long      i;
     for (i = 0; i<16; i++); //delay in McBsp init. must be at least 2 SRG cycles
}

相关帖子

沙发
jiaxw| | 2016-9-17 09:10 | 只看该作者
好复杂的程序
我想问下你的AD片选信号时用帧同步信号来控制的么

使用特权

评论回复
板凳
wuhany| | 2016-9-17 09:12 | 只看该作者
网上下个例程自己改一下吧
用个模拟的spi容易找到问题的。

使用特权

评论回复
地板
shimx| | 2016-9-17 09:15 | 只看该作者
感觉这样配置容易出错的。
再仔细看看吧

使用特权

评论回复
5
spark周|  楼主 | 2016-9-17 09:16 | 只看该作者
好的,我明天去单位试一下,多谢各位大侠了哈,结贴了先

使用特权

评论回复
6
pmp| | 2016-9-17 22:56 | 只看该作者
分析程序,最好能够带上IO的分配问题。

使用特权

评论回复
7
pmp| | 2016-9-17 22:58 | 只看该作者
不知道楼主的这个程序的逻辑是什么

使用特权

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

本版积分规则

821

主题

10121

帖子

4

粉丝