📄 dec5416io.c
字号:
/*********************************************************************************
* MEMORY.ASM v1.00 *
* 版权(c) 2003- 北京合众达电子技术有限责任公司 *
* 设计者: 段立锋 *
*********************************************************************************/
#include "uart.h"
#include "sysreg.h"
#include "dec5416.h"
#include "codec.h"
#include "mcbsp54.h"
#include "dma54xx.h"
#define MCBSP0_SPSA 0x0038u
#define MCBSP0_SPSD 0x0039u
#define MCBSP1_SPSA 0x0048u
#define MCBSP1_SPSD 0x0049u
#define MCBSP2_SPSA 0x0034u
#define MCBSP2_SPSD 0x0035u
#define MCBSP_SPCR1_SUB_ADDR 0x0000u
#define MCBSP_SPCR2_SUB_ADDR 0x0001u
#define MCBSP_RCR1_SUB_ADDR 0x002
#define MCBSP_RCR2_SUB_ADDR 0x003
#define MCBSP_XCR1_SUB_ADDR 0x004
#define MCBSP_XCR2_SUB_ADDR 0x005
#define MCBSP_SRGR1_SUB_ADDR 0x0006u
#define MCBSP_SRGR2_SUB_ADDR 0x0007u
#define MCBSP_MCR1_SUB_ADDR 0x0008u
#define MCBSP_MCR2_SUB_ADDR 0x0009u
#define SRGR1_INIT 0x0001u
#define MCBSP_PCR_SUB_ADDR 0x00E
#define MCBSP_CLKGDV 0x20 /*同步串口时钟设置*/
#define MCBSP_CLK_SPI 0x1000 /*同步串口时钟模式设置*/
extern char sys_statbuff[32];
extern char uarta_recbuff[128];
extern char uartb_recbuff[128];
/*串口的初始化*/
unsigned int uart_setup(unsigned int Channel,
unsigned int UartBaud,
unsigned int UartWordLen,
unsigned int UartStopBits,
unsigned int UartParity,
unsigned int UartFifoControl,
unsigned int UartLoopway)
{
unsigned int baudrateh,baudratel;
unsigned int uartdata;
/*设置波待率分频数为1*/
uart_write_reg(Channel,lcr,0xBF);
uart_write_reg(Channel,efr,0x10);
uart_write_reg(Channel,lcr,0x0);
uart_write_reg(Channel,mcr,0x0);
/*使能波待率设置寄存器*/
uart_write_reg(Channel,lcr,0x80);
/*设置波特率低位*/
baudratel = UartBaud & 0xff;
uart_write_reg(Channel,dll,baudratel);
/*设置波特率高位*/
baudrateh = (UartBaud & 0xff00) >>8;
uart_write_reg(Channel,dlh,baudrateh);
/*关闭波待率设置寄存器*/
uart_write_reg(Channel,lcr,0x00);
/*设置数据格式*/
uartdata = UartWordLen + UartStopBits + UartParity;
uart_write_reg(Channel,lcr,uartdata);
/*设置FIFO参数*/
uart_write_reg(Channel,fcr,UartFifoControl);
/*设置FIFO的深度*/
if(((UartFifoControl & 0xC0)>>6) == 0x00)
{
sys_statbuff[FIFOADIP + Channel] = 0x8;
}
else if(((UartFifoControl & 0xC0)>>6) == 0x01)
{
sys_statbuff[FIFOADIP + Channel] = 0x10;
}
else if(((UartFifoControl & 0xC0)>>6) == 0x10)
{
sys_statbuff[FIFOADIP + Channel] = 0x38;
}
else if(((UartFifoControl & 0xC0)>>6) == 0x11)
{
sys_statbuff[FIFOADIP + Channel] = 0x3c;
}
/*是否为闭环测试*/
uart_write_reg(Channel,mcr,UartLoopway);
return 0;
}
/*串口中断设置*/
unsigned int uart_interrupt_control(unsigned int Channel,
unsigned int UartIntr,
unsigned int enable)
{
unsigned int intenable;
/*没置中断源*/
uart_write_reg(Channel,ier,UartIntr);
/*设置中断使能*/
intenable = uart_read_reg(Channel,mcr);
intenable = intenable | enable;
uart_write_reg(Channel,mcr,intenable);
return 0;
}
/*MAX3310的设置*/
void max3310_set(unsigned int Channel,
unsigned int FastSet,
unsigned int HdplxSet)
{
unsigned int max3310t;
/*保存当前的寄存器设置*/
max3310t = uart_read_reg(Channel,mcr);
max3310t = (max3310t || (FastSet + HdplxSet<<4));
/*更新设置*/
uart_write_reg(Channel,mcr,max3310t);
}
/*串口发送*/
unsigned int uart_send(unsigned int Channel,
unsigned int longth,
char* send_data)
{
unsigned int i;
unsigned int lsrdata;
unsigned int timeout = 0x4000;
for(i = 0; i<longth ; i++)
{
timeout--;
lsrdata = uart_read_reg(Channel,lsr);
/*上一次发送是否完成*/
if(lsrdata & 0x40)
{
/*发送数据*/
uart_write_reg(Channel,thr,*(send_data++));
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
return 0;
}
/*串口接口*/
/*当FlagSet = 00时,使用接收数据不空做为标志
当FlagSet = 01时,使用缓冲区半满做为标志
当FlagSet = 02时,使用缓冲区全满做为标志*/
unsigned int uart_recive(unsigned int Channel,
unsigned int FlagSet,
char* rec_data)
{
unsigned int i,flag;
unsigned int data_longth;
if((sys_statbuff[UARTAERR + Channel] == 0) & (!(( sys_statbuff[RECAALL + Channel] ==0 ) & \
(sys_statbuff[RECACOUNT + Channel] ==0 ))))
{
/*确定接收参数*/
if( FlagSet == 00 )
{
flag = RECACOUNT +Channel;
data_longth = sys_statbuff[flag];
}
else if ( FlagSet == 01 )
{
flag = RECAHAL +Channel;
data_longth = 0x40;
}
else if ( FlagSet == 02 )
{
flag = RECAALL +Channel;
data_longth = 0x80;
}
for(i = 0; i<data_longth;i++)
{
/*接收串口的A通路*/
if(Channel == 0)
{
*rec_data = uarta_recbuff[i];
}
else/*接收串口的B通路*/
{
*rec_data = uartb_recbuff[i];
}
}
}
else
{
return 0xFFFF;
}
return 0;
}
/******************************************************************************/
/* codec_open() - 获得CODEC对应的MCBSP的唯一的句柄,并设置其各寄存器默认值 */
/* */
/* 参数: */
/* codec - 枚举变量CodecId中的一个元素,对应数据接口或是命令接口 */
/* */
/* 返回值: - 对应的有效句柄 */
/* */
/******************************************************************************/
HANDLE codec_open(CodecId codec)
{
/*判断是要打开哪个MCBSP*/
if(codec == 0)
{
unsigned int data;
/*打开的是数据接口,初始化McBSP0*/
/****************************************************************/
/* Place port in reset - setting XRST & RRST to 0 */
/****************************************************************/
/*进行发送复位*/
MCBSP_SUBREG_BITWRITE(codec, SPCR1_SUBADDR, RRST, RRST_SZ, 0);
/*进行接收复位*/
MCBSP_SUBREG_BITWRITE(codec, SPCR2_SUBADDR, XRST, XRST_SZ, 0);
/****************************************************************/
/* Set values of all control registers */
/****************************************************************/
/*设置SPCR1寄存器*/
MCBSP_SUBREG_WRITE(codec, SPCR1_SUBADDR,0x4080);
*(int *)MCBSP0_SPSA = MCBSP_SPCR1_SUB_ADDR;
data = *(int *)MCBSP0_SPSD;
/*设置RCR1寄存器,单数据相,接受数据长度为16位,每相2个数据*/
MCBSP_SUBREG_WRITE(codec, RCR1_SUBADDR, 0x140);
*(int *)MCBSP0_SPSA = MCBSP_RCR1_SUB_ADDR;
data = *(int *)MCBSP0_SPSD;
/*设置RCR2寄存器,单数据相
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -