📄 scc.txt
字号:
void SCC3_Init(void); /*SCC初始化*/
void SCC_BD_Init(void); /*HDLC Buffer Descriptor 初始化*/
bool SCC_Wait_Sended(void); /*等待SCC发送完毕*/
void SCC_Result(void); /*从超级终端显示结果*/
void SCC3_Init(void)
{
/*Disable SCC3 Tx Rx*/
pimm->scc_regs[SCC3_REG].scc_gsmr_l = 0x00000040; /*local loopback*/
pimm->pio_pdpar |= 0x0030; /*Configure port B pins: Set PDPAR[10,11]*/
pimm->pio_pddir &= 0xFFCF;
pimm->brgc4 = (0x10000 | 0x0008); /*(64M) 0x0008 1Mbps*/
pimm->si_sicr &= (0xFF00FFFF);
pimm->si_sicr |= (0x001B0000); /*Connect BRG4 to SCC3*/
pimm->dma_sdcr = 0x0001;
/**/
pimm->PRAM[SCC3_PRAM].pg.scc.h.rbase = (UHWORD) SCC_RXBD_BASE;
pimm->PRAM[SCC3_PRAM].pg.scc.h.tbase = (UHWORD) SCC_TXBD_BASE;
/**/
pimm->cp_cr = 0x0081; /*Execute the INIT RX AND TX Para command*/
pimm->PRAM[SCC3_PRAM].pg.scc.h.rfcr = 0x10; /* Byte Ordering*/
pimm->PRAM[SCC3_PRAM].pg.scc.h.tfcr = 0x10;
pimm->PRAM[SCC3_PRAM].pg.scc.h.mrblr = SCC_MAX_FRAME_LEN; /*Max Receive Buffer Length*/
pimm->PRAM[SCC3_PRAM].pg.scc.h.c_mask = 0x0000F0B8; /*16bit CRC*/
pimm->PRAM[SCC3_PRAM].pg.scc.h.c_pres = 0x0000FFFF;
pimm->PRAM[SCC3_PRAM].pg.scc.h.disfc = 0; /* Clear Discard Frame Counter */
pimm->PRAM[SCC3_PRAM].pg.scc.h.crcec = 0; /* Clear CRC Error Counter */
pimm->PRAM[SCC3_PRAM].pg.scc.h.abtsc = 0; /* Clear Abort Sequence Counter */
pimm->PRAM[SCC3_PRAM].pg.scc.h.nmarc = 0; /* Clear Nonmatching RX Address Counter */
pimm->PRAM[SCC3_PRAM].pg.scc.h.retrc = 0; /* Clear Frame Re-transmission Counter */
pimm->PRAM[SCC3_PRAM].pg.scc.h.mflr = SCC_MAX_FRAME_LEN; /* Max Frame Length */
pimm->PRAM[SCC3_PRAM].pg.scc.h.rfthr = 1; /* Rx Frames Threshold */
pimm->PRAM[SCC3_PRAM].pg.scc.h.hmask = 0x0000; /*Allow all address*/
pimm->PRAM[SCC3_PRAM].pg.scc.h.haddr1 = 0x0000;
pimm->PRAM[SCC3_PRAM].pg.scc.h.haddr2 = 0x0000;
pimm->PRAM[SCC3_PRAM].pg.scc.h.haddr3 = 0x0000;
pimm->PRAM[SCC3_PRAM].pg.scc.h.haddr4 = 0x0000;
/*Set SCC BD address*/
for(int i=0;i<SCC_RXBD_NUM;i++)
{
scc_rxbd[i] = (BD *) (UWORD(pimm) + SCC_RXBD_BASE + 8*i);
}
for(int i=0;i<SCC_TXBD_NUM;i++)
{
scc_txbd[i] = (BD *) (UWORD(pimm) + SCC_TXBD_BASE + 8*i);
}
/*Set SCC BUF address*/
for(int i=0;i<SCC_RXBUF_NUM;i++)
{
scc_rxbuf[i] = (BUF *) (UWORD(pimm) + SCC_RXBUF_BASE + i);
}
for(int i=0;i<SCC_TXBUF_NUM;i++)
{
scc_txbuf[i] = (BUF *) (UWORD(pimm) + SCC_TXBUF_BASE + i);
}
/*Clear SCC BD and RX BUF with 0x00*/
for(int i=0;i<SCC_RXBD_NUM;i++)
{
scc_rxbd[i]->bd_sc = (UHWORD) 0;
scc_rxbd[i]->bd_len = (UHWORD) 0;
scc_rxbd[i]->bd_p = (UBYTE *) 0;
}
for(int i=0;i<SCC_TXBD_NUM;i++)
{
scc_txbd[i]->bd_sc = (UHWORD) 0;
scc_txbd[i]->bd_len = (UHWORD) 0;
scc_txbd[i]->bd_p = (UBYTE *) 0;
}
for(int i=0;i<SCC_RXBUF_NUM;i++)
{
scc_rxbuf[i]->buf = (UBYTE) 0;
}
/*Set TX BUF*/
scc_txbuf[0]->buf = (UBYTE) (SCC_HDLC_ADDR & 0x00FF);
scc_txbuf[1]->buf = (UBYTE) (SCC_HDLC_ADDR >> 8);
for(int i=2;i<SCC_TXBUF_NUM_1;i++)
{
scc_txbuf[i]->buf = (UBYTE) 0x55;
}
scc_txbuf[0+SCC_TXBUF_NUM_1]->buf = (UBYTE) (SCC_HDLC_ADDR & 0x00FF);
scc_txbuf[1+SCC_TXBUF_NUM_1]->buf = (UBYTE) (SCC_HDLC_ADDR >> 8);
for(int i=2;i<SCC_TXBUF_NUM_2;i++)
{
scc_txbuf[i+SCC_TXBUF_NUM_1]->buf = (UBYTE) 0xAA;
}
scc_txbuf[0+SCC_TXBUF_NUM_1+SCC_TXBUF_NUM_2]->buf = (UBYTE) (SCC_HDLC_ADDR & 0x00FF);
scc_txbuf[1+SCC_TXBUF_NUM_1+SCC_TXBUF_NUM_2]->buf = (UBYTE) (SCC_HDLC_ADDR >> 8);
for(int i=2;i<SCC_TXBUF_NUM_3;i++)
{
scc_txbuf[i+SCC_TXBUF_NUM_1+SCC_TXBUF_NUM_2]->buf = (UBYTE) (i-2);
}
/**/
SCC_BD_Init();
pimm->scc_regs[SCC3_REG].scc_gsmr_h = 0; /*for SCC3,both the RX FIFO and TX FIFO are 16 bytes*/
pimm->scc_regs[SCC3_REG].scc_gsmr_l = 0;
pimm->scc_regs[SCC3_REG].scc_gsmr_l = 0x00000040; /*local loopback*/
pimm->scc_regs[SCC3_REG].scc_scce = 0xFFFF; /* Clear SCCE Register by writing all 1's. */
pimm->scc_regs[SCC3_REG].scc_gsmr_l = 0x00000070; /*Enable Transmit/Receive */
}
void SCC_BD_Init(void)
{
/*[SCC_RXBD_NUM = 3]*/
scc_rxbd[0]->bd_sc = (UHWORD) SCC_RXBD_SC;
scc_rxbd[0]->bd_p = (UBYTE *) scc_rxbuf[0];
scc_rxbd[1]->bd_sc = (UHWORD) SCC_RXBD_SC;
scc_rxbd[1]->bd_p = (UBYTE *) scc_rxbuf[SCC_RXBUF_NUM_1];
scc_rxbd[2]->bd_sc = (UHWORD) SCC_RXBD_SC_LAST;
scc_rxbd[2]->bd_p = (UBYTE *) scc_rxbuf[SCC_RXBUF_NUM_1 + SCC_RXBUF_NUM_2];
/*[SCC_TXBD_NUM = 3]*/
scc_txbd[0]->bd_sc = (UHWORD) SCC_TXBD_SC;
scc_txbd[0]->bd_p = (UBYTE *) scc_txbuf[0];
scc_txbd[0]->bd_len = (UHWORD) SCC_TXBUF_NUM_1;
scc_txbd[1]->bd_sc = (UHWORD) SCC_TXBD_SC;
scc_txbd[1]->bd_p = (UBYTE *) scc_txbuf[SCC_TXBUF_NUM_1];
scc_txbd[1]->bd_len = (UHWORD) SCC_TXBUF_NUM_2;
#ifdef TEST_SCC_ERROR
scc_txbd[1]->bd_sc = (UHWORD) 0x9800; /* No Tx CRC */
#endif
scc_txbd[2]->bd_sc = (UHWORD) SCC_TXBD_SC_LAST;
scc_txbd[2]->bd_p = (UBYTE *) scc_txbuf[SCC_TXBUF_NUM_1 + SCC_TXBUF_NUM_2];
scc_txbd[2]->bd_len = (UHWORD) SCC_TXBUF_NUM_3;
}
bool SCC_Wait_Sended(void)
{
for(int i=0;i<SCC_RXBD_NUM;i++)
{
while( (scc_rxbd[i]->bd_sc | 0x7FFF) == 0xFFFF );
}
pimm->scc_regs[SCC3_REG].scc_gsmr_l = 0x00000040;
return SEND_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -