HFC-S mini芯片初始化

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();
}
 

你可能感兴趣的:(Embedded,-,芯片学习)