请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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;
}