This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8333万:McBSP至音频编解码器PCM 3010

Guru**** 2390765 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/615539/tms320f28333-mcbsp-to-audio-codec-pcm-3010

部件号: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;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Ishmael,

    您是否可以添加范围捕获注释并分享更多内容? 蓝色信号是否是您的FSX? 黄色是MCLKX?
    请将XPhase (XPhase)设置为1,因为您使用的是双相传输,一个用于左通道,一个用于右通道。

    有关 将McBSP用作I2S的概述,请查看SPRA595。 它适用于C6000产品系列,但McBSP模块是等效的,因此配置仍然有效。

    谢谢!
    标记