您的位置:首页 > 其它

HFC-S mini芯片初始化

2008-04-21 09:47 281 查看
HFC-S mini芯片的使用还是有点复杂,但是已经有同事在其它的模块中使用了该芯片,因此我的工作就简单很多,将代码拷贝过来,根据硬件的设计将代码作必要的修改,整个初始化的流程是没有变的,对于其它系统也是有参考作用。

/**
* HDLC初始化
*/
hdlc_ini(void)
{
unsigned int n;
unsigned char m;
unsigned int k;
unsigned char buf[256];
hfcId=0;
//读取HFC芯片R_CHIP_ID寄存器内容,也就是芯片ID
while(hfcId !=V_CHIP_ID)
{
readHfcAdr(R_CHIP_ID,hfcId);
}
/*
m=0;
for(k=0;k<256;k++)
{
hfcAdr(W_RAM_ADR_L)=m;
hfcAdr(W_RAM_ADR_H)=0;
hfcAdr(A_RAM_DATA)=m+1;
m++;
}
m=0;
for(k=0;k<256;k++)
{
hfcAdr(W_RAM_ADR_L)=m;
hfcAdr(W_RAM_ADR_H)=0;
readHfcAdr(A_RAM_DATA,buf[k]);
m++;
}
*/
//芯片复位
hfcAdr(W_CIRM)=V_CIRM_RST;
for(n=0;n<500;n++);
//复位完毕后,清除复位寄存器内容
hfcAdr(W_CIRM)=V_CIRM_DIS_RST;

//R_FIF_F1(0x0C)FIFO input HDLC frame counter F1
//该寄存器保存FIFO输入帧数量
/* Rainman 2008.04.14
* 下面这个循环跟老彭确认后,是当时调试硬件临时添加的代码,应该去掉
for(n=0;n<500;n++)
{
readHfcAdr(R_FIF_F1,m);
if((m & 1) == 0) break;
}
*/
for(n=0;n<500;n++);

//W_CLKDEL - Clock control register of the S/T module
hfcAdr(W_CLKDEL)=V_CLKDEL;
//W_SCTRL - Control register of the S/T interface, register 0
//V_SCTRL = 0x43,0100.0011b
//B0=1,B1 send data enabled
//B1=1,B2 send data enabled
//B2=0,S/T Interface mode,TE mode
//B3=0,D-Chanel priority, high
//B4=0,S/Q bits transmission disabled
//B5=0,96KHz test signal disabled
//B6=1,non capacitive line mode
//B7=0,Power down, normal operation
hfcAdr(W_SCTRL)=V_SCTRL;
//W_ST_WR_STA(0x30) - S/T state machine register
//设定初始值为0
hfcAdr(W_ST_WR_STA)=V_ST_WR_STA;
//W_SCTRL_R(0x33) - Control register of the S/T interface, register 2
//设定B1和B2频道都为通用操作模式
hfcAdr(W_SCTRL_R)=V_SCTRL_R;
//设定D、E通道为通用操作模式
hfcAdr(W_SCTRL_E) = 0x00;

//W_B1_SSL(0x20) - Slot assigner for HFC-channel[B1,TX] and PCM time slot configuration
//V_B1_SSL = 0xDD
//output buffer for STIO2 enabled
//使用29时隙
hfcAdr(W_B1_SSL)=V_B1_SSL;
//W_B1_RSL(0x24) - Slot assigner for HFC-channel[B1,RX] and PCM time slot configuration
//receive data from STIO1,使用29时隙
hfcAdr(W_B1_RSL)=V_B1_RSL;

//设置B2通道的时隙
hfcAdr(W_B2_SSL)=V_B2_SSL;
hfcAdr(W_B2_RSL)=V_B2_RSL;

//设定AUX1通道接收和发送时隙号
hfcAdr(W_AUX1_SSL) = V_AUX1_TX_ROUT + V_AUX1_TX_SL;
hfcAdr(W_AUX1_RSL) = V_AUX1_RX_ROUT + V_AUX1_RX_SL;

//W_MST_MODE0(0x14) - PCM mode, register 0
//V_MST_MODE0 = 0xEC
hfcAdr(W_MST_MODE0)=V_MST_MODE0;
//W_MST_MODE1(0x15) - PCM mode, register 1
//V_MST_MODE1 = 0x20,8MBit/s
hfcAdr(W_MST_MODE1)=V_MST_MODE1; // | 0x40, loop test
//W_MST_MODE2(0x16) - PCM mode, register 2
//V_MST_MODE2 = 0x34,选择时隙在96-127,SYNC_I is connected to SYNC_O
hfcAdr(W_MST_MODE2)=V_MST_MODE2;

//W_F_THRES(0x0C) - FIFO fill level control register
//V_F_THRES = 0xFF
hfcAdr(W_F_THRES)=V_F_THRES;
//W_F_MODE(0x0D) - 工作模式
//V_F_MODE = 0,Simple Mode
hfcAdr(W_F_MODE)=V_F_MODE;
//W_CON_HDLC(0xFA) - HDLC and connection settings of the selected FIFO
/* Rainman 2008.04.14
* 下面这个循环跟老彭确认后,是当时调试硬件临时添加的代码,应该去掉
for(m=4;m<8;m++)
{
hfcAdr(W_FIFO)=V_FIFO_B2TRA;
hfcAdr(W_CON_HDLC)=3;
}
*/
}

/**
* HDLC0复位
*/
void hdlc0_rst(void)
{
unsigned char n;
//关中断
di();
//设定要操作的HDLC通道以及方向
//V_FIFO_B1TRA - 通道0,方向为发送
hfcAdr(W_FIFO)=V_FIFO_B1TRA;
for(n=0;n<(unsigned)100;n++);
//复位HDLC发送通道1
hfcAdr(W_INC_RES_F)=V_INC_RES_F_RST;

//V_FIFO_B1REC - 通道0,方向为接收
hfcAdr(W_FIFO)=V_FIFO_B1REC;
for(n=0;n<(unsigned)100;n++);
//复位HDLC接收通道1
hfcAdr(W_INC_RES_F)=V_INC_RES_F_RST;
//开中断
ei();
}

/**
* HDLC0初始化
*/
void hdlc0_ini(void)
{
di();
//设定对HDLC发送通道1进行操作
hfcAdr(W_FIFO)=V_FIFO_B1TRA;
//设定所有发送BIT位都需要被处理
hfcAdr(W_CH_MASK)=V_CH_MASK;
//设定HDLC控制寄存器,内容如下:
//1、使用0x7E作为帧标志
//2、芯片工作在HDLC模式
//3、在帧结尾产生中断
//4、数据传输方向为FIFO->PCM
hfcAdr(W_CON_HDLC)=V_CON_HDLC_SEND;

//设定对HDLC接收通道1进行操作
hfcAdr(W_FIFO)=V_FIFO_B1REC;
//设定所有接收BIT位都需要处理
hfcAdr(W_CH_MASK)=V_CH_MASK;
//设定HDLC控制寄存器
hfcAdr(W_CON_HDLC)=V_CON_HDLC_REC;
ei();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: