C6416 mcbsp 配置例程
时间: 2024-02-05 09:04:31 浏览: 123
以下是C6416 McBSP的配置例程,供参考:
首先需要包含相应的头文件:
```
#include <c6x.h>
#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_irq.h>
```
然后定义所需的变量:
```
#define SAMPLE_RATE 8000 //采样率为8kHz
#define WORD_SIZE 16 //每个采样点的字长为16位
#define BUF_SIZE 64 //定义一个缓冲区大小为64
#define MCBSP_BASE CSL_MCBSP_0 //定义 McBSP 控制器的基地址
volatile Uint16 tx_buf[BUF_SIZE]; //定义发送缓冲区
volatile Uint16 rx_buf[BUF_SIZE]; //定义接收缓冲区
volatile Uint16 tx_cnt = 0; //定义发送计数器
volatile Uint16 rx_cnt = 0; //定义接收计数器
```
接下来是 McBSP 的初始化函数:
```
void init_mcbsp()
{
MCBSP_Config mcbspCfg;
IRQ_Config irqCfg;
//配置 McBSP 控制器
mcbspCfg.loopback = MCBSP_LOOPBACK_OFF;
mcbspCfg.free = MCBSP_FREE_SOFT;
mcbspCfg.syncMode = MCBSP_SYNC_MODE_EXTERNAL;
mcbspCfg.clkMode = MCBSP_CLK_MODE_EXTERNAL;
mcbspCfg.clkPolarity = MCBSP_CLK_POL_ACTIVE_HIGH;
mcbspCfg.fsPolarity = MCBSP_FS_POL_ACTIVE_LOW;
mcbspCfg.fsSyncDelay = MCBSP_FS_DELAY_ONE_CLK;
mcbspCfg.fsWidth = MCBSP_FS_WIDTH_ALL_WORD;
mcbspCfg.dxEnable = MCBSP_Dx_ENABLE;
mcbspCfg.dxDelay = 0;
mcbspCfg.rxDelay = MCBSP_RX_DELAY_0_BIT;
mcbspCfg.txDelay = MCBSP_TX_DELAY_0_BIT;
mcbspCfg.rxCompand = MCBSP_RX_NO_COMPAND;
mcbspCfg.txCompand = MCBSP_TX_NO_COMPAND;
mcbspCfg.rxDataDelay = MCBSP_RX_DATA_DELAY_0_BIT;
mcbspCfg.txDataDelay = MCBSP_TX_DATA_DELAY_0_BIT;
mcbspCfg.rxJustification = MCBSP_RX_JUSTIFY_RIGHT;
mcbspCfg.txJustification = MCBSP_TX_JUSTIFY_RIGHT;
mcbspCfg.phase = MCBSP_PHASE_SINGLE;
mcbspCfg.dataLength = MCBSP_WORD_LENGTH_WORD_16;
mcbspCfg.wordLength = MCBSP_WORD_LENGTH_WORD_16;
mcbspCfg.clkDiv = 0;
//初始化 McBSP 控制器
MCBSP_init(MCBSP_BASE, &mcbspCfg);
//配置 McBSP 中断
irqCfg.arg = 0;
irqCfg.priority = 3;
irqCfg.mask = IRQ_EPI_MCBSP0_RX;
irqCfg.handler = rx_isr;
IRQ_clear(irqCfg.mask);
IRQ_plug(irqCfg.mask, &irqCfg);
IRQ_enable(irqCfg.mask);
irqCfg.mask = IRQ_EPI_MCBSP0_TX;
irqCfg.handler = tx_isr;
IRQ_clear(irqCfg.mask);
IRQ_plug(irqCfg.mask, &irqCfg);
IRQ_enable(irqCfg.mask);
//启动 McBSP 控制器
MCBSP_start(MCBSP_BASE, MCBSP_TX_ENABLE | MCBSP_RX_ENABLE);
}
```
其中,rx_isr 和 tx_isr 分别是接收和发送的中断处理函数,需要在后面定义。
接下来是进入主函数进行初始化和循环发送接收:
```
int main(void)
{
int i;
for(i = 0; i < BUF_SIZE; i++)
{
tx_buf[i] = 0;
rx_buf[i] = 0;
}
init_mcbsp();
while(1)
{
if(tx_cnt < BUF_SIZE) //如果还有数据需要发送
{
MCBSP_write(MCBSP_BASE, tx_buf[tx_cnt]); //发送数据
tx_cnt++;
}
if(rx_cnt < BUF_SIZE) //如果还有数据需要接收
{
rx_buf[rx_cnt] = MCBSP_read(MCBSP_BASE); //接收数据
rx_cnt++;
}
if(tx_cnt == BUF_SIZE && rx_cnt == BUF_SIZE) //如果发送和接收都完成了
{
tx_cnt = 0; //重置计数器
rx_cnt = 0;
//在这里进行数据处理
MCBSP_start(MCBSP_BASE, MCBSP_TX_ENABLE | MCBSP_RX_ENABLE); //重新启动 McBSP 控制器
}
}
return 0;
}
```
最后是接收和发送的中断处理函数:
```
void rx_isr(void)
{
if(rx_cnt < BUF_SIZE)
{
rx_buf[rx_cnt] = MCBSP_read(MCBSP_BASE); //接收数据
rx_cnt++;
}
}
void tx_isr(void)
{
if(tx_cnt < BUF_SIZE)
{
MCBSP_write(MCBSP_BASE, tx_buf[tx_cnt]); //发送数据
tx_cnt++;
}
}
```
以上就是C6416 McBSP的配置例程,希望对您有所帮助。
阅读全文