⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scc.txt

📁 本代码应用于串口通信的应用熟悉Tornado的集成开发环境
💻 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 + -