请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:TMS320F2.8333万 大家好,
我试图通过McBSP连接音频编解码器,但是我已经多次进行设置,无法更改帧同步周期和宽度以获得正确的LR时钟。 谢谢,我将附上一些示波器图像。
/* * I2S.c * *创建时间:2017年7月19日 * 作者:ish的Master Race PC */ #include <DSP28x_Project.h> #include <DSP2833x_McBSPF.h> #include "timer.h" UINT32 sample_L = 0b10101010101010101010101010101010101010BSP; UINT32 sample_R = 中断= U16 Johns = 0xFFFF;UITH_ISL_INDSL_INDS2S10101010101010101010101010101010101010BSP;Isr_IN1=中断 =中断= 0 DisableDog (); InitPll (10,2); InitPeripheralClocks(); InitMcbspaGpio(); 色调; // //将PIE控制寄存器初始化到其默认状态。 //默认状态是禁用所有PIE中断和标志 //被清除。 //此函数位于DSP2833x_PIECTRL.c文件中。 // InitPieCtrl(); // //禁用CPU中断并清除所有CPU中断标志 // IER = 0x0000; IFR = 0x0000; // //使用指向外壳中断的指针初始化PIE矢量表 //服务例程(ISR)。 //这将填充整个表,即使中断也是如此 //在本例中不使用。 这对于调试非常有用。 // shell ISR例程可在DSP2833x_DefaultIsr.C.中找到 //此函数位于DSP2833x_PieVect.C.中 // InitPieVectorTable(); // //本示例中使用的中断被重新映射到 //此文件中找到ISR函数。 // EALLOW; //允许访问EALLOW保护寄存器 PieVectorTable.MRINTA=&McBSP_RxINTA_ISR; PieVectorTable.MXINTA=&McBSP_TxINTA_ISR; EDIS; //禁用对EALLOW保护寄存器的访问 // //步骤4. 初始化所有设备外围设备: //此函数位于DSP2833x_InitPeripherals.c中 // // InitPeripherals();//本示例不需要 // //启用此示例所需的中断 // PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //启用PIE块 PieCtrlRegs.PIEIER6.bit.INTx5=1; //启用PIE组6,INT 5 PieCtrlRegs.PIEIER6.bit.INTx6=1; //启用PIE组6,INT 6 //在设置为main时更改 IER =0x20; //启用CPU INT6 EINT; //启用全局中断 InitMcbspaI2s(); //timer_init (150.0 ,22.6757); //enable_timer_interrupT_DFT(); //GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0;// demphesis 0 gpioCtrlRegs.GPAMUX2.bit.GPIO24 = 0;// demphesis 0 gpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0;// demphesis 1 gpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0;// pdwn GpioDataRegs.GPADAT.bit.GPIO24 = 0; GpioDataRegs.GPADAT.bit.GPIO25 = 0; GpioDataRegs.GPADAT.bit.GPIO26 = 1; while (McbspaRegs.SPCR2.bit.XRDY == 0) McbspaRegs.DXR2.all = Johns; McbspaRegs.DXR1.all = johns2; while (1){ // while (McbspaRegs.SPR2.bit.XRDY == 0) // McbspaRegs.DXR2.all = Johns; // McbspaRegs.DXR1.all = johns2; } } 作废InitMcbspaI2S(void){ /* *连接 * MCLKXA <-来自DAC的BCLK用于传输时钟 * MFSXA <-来自DAC的WCLK,用于帧同步信号 *// 位时钟设置 //字大小* FS * 2 = 24 * 4.41万 * 2 = 211.68万 //设置Word时钟 //FS // XCLKOUT设置 EALLOW; SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK =1; SysCtrlRegs.PCLKCR3.bit.XINTFENCLK =1;//启用外部时钟 XintfRegs.XINTCNF2.bit.XTIMCLK = 1;//XCLKOUT为SYSCLKOUT/4 XintfRegs.XINTCNF2.bit.CLKMODE = 1;//这使得37.5MHz DAC MCLK成为一个显卡 XintfRegs.XINTCNF2.bit.CLKOFF = 0; EDIS; //重置所有寄存器 EALLOW; McbspaRegs.SPCR2.all=0x0000;//重置FS发生器,采样率发生器和发送器 McbspaRegs.SPCR1.all=0x0000;//重置接收 器中断,右对齐单词McbspaRegs.SPCr1.RST = 2;//左对齐Mspr1.fill = 0;全部Msp= 0 // McBSP中断标志- RRDY,数据准备读取 McbspaRegs.SPCR2.bit.XINTM =0;// McBSP中断标志- XRDY,数据准备接受新传输 McbspaRegs.RCR2.all=0x0;// 清除接收控制寄存器McbspaRegaRegs.R1.R1.McRegs=0;所有寄存器McRegbspaRS.0xCr2.s=0xCr2.s= McRegs1.s=所有寄存器= McRegs.0xCr2.spa0;所有寄存器= Mcr2.s1.spaRS.0xCr2.s= McRegs1.s= McRegs1.s1.s=所有寄存器= 0 McbspaRegs.SPR2.bit.free = 1; McbspaRegs.RCR2.bit.RFIG = 0; McbspaRegs.XCR2.bit.XConfig = 0; //时钟// 源时钟 McbspaRegs.pcr.bit.scLKME = 0;//来自LSPCLK McbspaRegs.SRGR2.bit.CLKSM = 1;// LSPCLK是SRG McbspaRegs.SRGR1.bit.CLV = 60;//KGRM.CLSPRM.CLKSPrb.1 ;内置SPRM.CLKSPRb.CLKSPRb.CLKSPR/时 钟信号传输 时钟= McReg.CLSPrbspbspb.CL1;KSPRM.CLKSPRM.CLKSPRM.CLKSPRM.CLKSPRM.CLKSPRM.CLKSPRM.CLKSPRM.CLKSPRM.CLKSPRM.CLKSPR1.CL //采样速率发生器 McbspaRegs.pcr.bit.fsXM = 1生成帧同步脉冲;//接收帧同步由采样速率gen McbspaRegs.pcr.bit.fSRM = 1提供;//传输帧同步由采样速率gen提供 //TX,RX时钟边缘 McbspaRegs.preg.bit.CLKRP = 0;//在CLKR McbspaRegs.preg.bit.CLKXP上升沿采样的Rcvd数据= 1;//在CLKX //FS下降沿采样的Tx数据 时钟边缘 McbspaRegs.pc.bit.fsrp = 1; 接收频率(高频) //传输帧同步脉冲处于活动高电位(R通道优先) //帧同步宽度 //帧同步宽度 McbspaRegs.SRGR2.bit.FPER = 47;//period为47 + 1 McbspaRegs.SRGR1.bit.FWID = 23;//脉冲宽度为23 + 1 // 2个接收阶段,每个阶段为1个字(24位) McbspaRegs.RCR1.bit.RWDLEN1 =4;//接收字1是24位数据 McbspaRegs.RCR1.bit.RFRLEN1 =1;//接收帧长度1:1字 McbspaRegs.RCR2.bit.RWDLEN2 = 4;//接收字2是24位数据 McbspaRegs.RCR2.bit.RFRLN2 = 1;//接收帧长度2:1个字 McbspaRegs.RCR2.bit.RPHASE = 0;//2接收相位(左和右) //数据延迟 McbspaRegs.RCR2.bit.RDATDLY =1;//接收数据延迟的长度(1位) // 2个传输阶段,每个为1个字(24位) McbspaRegs.XCR1.bit.XWDLEN1 = 4;// TX单词1是24位 McbspaRegs.XCR1.bit.XFRLEN1 = 1;//传输帧长度2:1个字 McbspaRegs.XCR2.bit.XWDLEN2 = 4;//传输24位数据 McbspaRegs.XCR2.bit.XFRLEN2 = 1;//传输帧长度2:1字 McbspaRegs.XCR2.bit.XPhase = 0;//2传输相位(左和右?) //数据延迟 McbspaRegs.XCR2.bit.XDATDLY =1;//数据传输的数据延迟长度(1位) //正在启用 //delay_loop(); McbspaRegs.MFFINT.Bit.XINT =1;//启用发射中断 McbspaRegs.MFFINT.bit.rint =1; delay_loop(); McbspaRegs.SPCR2.bit.GRST = 1; delay_loop(); McbspaRegs.SPR2.bit.XRST = 1; McbspaRegs.SPCR1.bit.RRST = 1; delay_loop(); //需要等待至少2*(1/100MHz) McbspaRegs.SPR2.bit.frst = 1; delay_loop(); EDIS; } __interrupt void McBSP_TxINTA_ISR(void){ IF (0 == ch_sel){ CH_SEL = 1; McbspaRegs.DXR2.all = sample_L; McbspaRegs.DXR1.all = sample_L; } 否则{ CH_SEL = 0; McbspaRegs.DXR2.all = sample_R; McbspaRegs.DXR1.all = sample_R; } PIECtrlRegs.PIEACK_ALL = PIEACK_group6; }__interrupt void McBSP_RxINTA_ISR(void){ PIECtrlRegs.PIEACK.ALL = PIEACK_group6; }