📄 c6711_mcbsp.c
字号:
/*****************************************************************************
* File name : C6711_McBSP.c
* Description:
******************************************************************************/
#ifndef MASTER_FILE
#define C6711_GLOBALS
#include "includes.h"
#endif
#include "McBSP.H"
/******************************************************************************
* function : McBSP0_init()
* DESCRIPTION : Initializes multi-channel serial port 0 for 16 bits of data
* in per frame slave mode.
* Input : None
* Output : None
******************************************************************************/
void mcbsp0_init(void)
{
/* Setup McBSP0 */
volatile unsigned int temp =0;
/* Reset serial port */
*(unsigned volatile int *)McBSP0_SPCR = 0;
/* Set pin control reg */
*(unsigned volatile int *)McBSP0_PCR = 0;
/* Set rx control reg for one 16 bit data/frame */
*(unsigned volatile int *)McBSP0_RCR = 0x10040;
/* Set tx control reg for one 16 bit data/frame */
*(unsigned volatile int *)McBSP0_XCR = 0x10040;
*(unsigned volatile int *)McBSP0_DXR = 0;
/* Setup SP control reg */
*(unsigned volatile int *)McBSP0_SPCR = 0x12001;
}
/*******************************************************************************
* FUNCTION : mcbsp0_write
* ARGUMENTS : INT out_data <-- Value to write to McBSP0
* DESCRIPTION: Checks to see if output register is empty.
* If empty write new data to it
* OUTPUTS : VOID
*******************************************************************************/
void mcbsp0_write(int out_data)
{
int output_reg;
output_reg = *(unsigned volatile int *)McBSP0_SPCR & 0x20000;
while ( output_reg == 0)
{
output_reg = *(unsigned volatile int *)McBSP0_SPCR & 0x20000;
}
*(unsigned volatile int *)McBSP0_DXR = out_data;
}
/*******************************************************************************
* FUNCTION : mcbsp0_read
* ARGUMENTS : VOID
* DESCRIPTION : Checks to see if input register is full.
* If full read data from it.
* OUTPUTS : INT <-- Data read from input register
*******************************************************************************/
int mcbsp0_read()
{
int input_reg;
input_reg = *(unsigned volatile int *)McBSP0_SPCR & 0x2;
while ( input_reg == 0)
{
input_reg = *(unsigned volatile int *)McBSP0_SPCR & 0x2;
}
input_reg = *(unsigned volatile int *)McBSP0_DRR;
return input_reg;
}
/*******************************************************************************
* FUNCTION : mcbsp0_test
* ARGUMENTS : VOID
* DESCRIPTION : Tests multi-channel serial port 0 in internal loopback
* mode after setting up its own clock.
* OUTPUTS : INT 0 <-- If successful
*******************************************************************************/
int mcbsp0_test()
{
/* Setup McBSP0 */
volatile unsigned int temp = 0, temp1;
/* Reset serial port */
*(unsigned volatile int *)McBSP0_SPCR = 0;
/* Set baud rate to 1MHz */
*(unsigned volatile int *)McBSP0_SRGR = 0x2014004A;
/* Set pin control reg */
*(unsigned volatile int *)McBSP0_PCR = 0xA00;
/* Set rx control reg one 16 bit data/frame */
*(unsigned volatile int *)McBSP0_RCR = 0x10040;
/* Set tx control reg one 16 bit data/frame */
*(unsigned volatile int *)McBSP0_XCR = 0x10040;
/* Setup SP control reg */
*(unsigned volatile int *)McBSP0_SPCR = 0xC1A001;
*(unsigned volatile int *)McBSP0_DXR = 0xAAAA;
temp1 = *(unsigned volatile int *)McBSP0_DRR;
temp1 = mcbsp0_read();
mcbsp0_write(0x5555);
temp = mcbsp0_read();
temp &= 0xffff;
if (temp != 0x5555)
{
temp = 1;
return temp;
}
mcbsp0_write(0xaaaa);
temp = mcbsp0_read();
temp &= 0xffff;
if (temp != 0xaaaa)
{
temp = 1;
return temp;
}
return 0;
}
/*******************************************************************************
* FUNCTION : play_codec
* ARGUMENTS :INT number <-- Number of samples
* INT tone_playbk <-- Audio in playback if 0, Tone if 1
* DESCRIPTION :This function initializes the DSP's McBSP and the AIC's codec before
* playing the codec input through its output or generating a tone.
*******************************************************************************/
short sin_table[] = {0, 23170>>2, 32767>>2, 23170>>2,0, -23170>>2, -32767>>2, -23170>>2};
void play_codec(int number, int tone_playbk)
{
int i,j;
int temp;
// set up control register 3 for S/W reset
mcbsp0_read(); /* do a dummy read to synchronize read and write */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(1); /* write 1 to indicating next data is control */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x0386); /* do a s/w reset */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
// set up control register 3 for mic input
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(1); /* write 1 to indicating next data is control */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x0306); /* set up reg 3 */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(1); /* write 1 to indicating next data is control */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x2330); /* request reg 3 */
temp = mcbsp0_read(); /* read reg 3 */
mcbsp0_write(0x0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
//set up control register 4
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(1); /* write 1 to indicating next data is control */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x0400); /* set up reg 4 */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(1); /* write 1 to indicating next data is control */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x2430); /* request reg 4 */
temp = mcbsp0_read(); /* read reg 4 */
mcbsp0_write(0x0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
// set up control register 5
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(1); /* write 1 to indicating next data is control */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x0502); /* set up reg 5 */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(1); /* write 1 to indicating next data is control */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x2530); /* request reg 5 */
temp = mcbsp0_read(); /* read reg 5 */
mcbsp0_write(0x0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
mcbsp0_write(0x0); /* write 0 to serial port as normal data */
mcbsp0_read(); /* do a read to keep write and read synchronized */
if(tone_playbk)
{
for (i=0; i< 8; i++)
{
sin_table[i] = sin_table[i] & 0xfffe;
}
for (i=0;i<number;i++)
{
for (j=0;j<8;j++)
{
mcbsp0_write((int)sin_table[j]);
}
}
}
else
{
for (i=0;i<number;i++)
{
temp = mcbsp0_read();
temp = temp & 0xfffe;
mcbsp0_write(temp);
}
}
}
/* END OF FILE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -