使用UART輸入 FIFO Data給A8137 Tx發射,再由對端的A8137 RX接收後,經過Rx端的UART解析出來

SamYang2023-12-2151核106
  • 系統概念圖

投影片1.JPG

代碼:

RC_A8137_x0_Reference code for FIFO mode_1M_2Mbps CL=18pF V2.5 - Uart mode.zip

    1.    Tx端接線為P3_5=1 & P3_2=1時,為Uart mode(FIFO data需由外部Uart輸入進來),若將P3_2接GND時,為一般Easy FIFO mode(直接抓取MCU內建定義的FIFO Data),Uart的波特率為38400,這邊會使用UartCnt來判斷Uart RX Buffer是否滿64Byte,若滿了之後,會開始將Uart RX Buffer 內的資料依序填入A8137的Tx FIFO Address:0x900

image.png

			if(P3_2==0) //P3_2=0=>Easy mode mode
			{
				WriteFIFO();
			}
			else //P3_2=1==>Uart FIFO mode
			{
				while(UartCnt!=64);
				//Write FIFO
				for(UartCnt = 0; UartCnt < 64; UartCnt++)
					RFLIB_WriteReg(TXFIFO_REG + UartCnt , UartRXBuf[UartCnt]);
				
				UartCnt=0;			
			}

使用Timer2來計算波特率38400bps:

#define BaudRate38400	(65536-((16000000)/(32*38400)))    //crystal=16MHz,timer2
void InitUart0Timer2(void)
{
	IOSEL |= 0x01;//enable BBIOS + UART
	PCON = 0x00;
	SCON = 0x40;
	T2CON = 0x30;
	RCAP2H = BaudRate38400 / 256;
	RCAP2L = BaudRate38400 % 256;
	TR2=1;
	REN = 1;
	ES=1;//enable uart0 interrupt
}

 Uart Function Code:

void Uart0Isr(void) interrupt 4 using 3
{
	if (TI==1)
	{
		TI=0;
		UartSendCnt--;
		if(UartSendCnt !=0)
		{
			Uartptr++;
			SBUF = *Uartptr;
		}
	}
	
	if (RI==1)
	{
		RI=0;
		UartRXBuf[UartCnt]=SBUF;
		UartCnt++;
	}  
}


  2.    當Tx FIFO Buffer填滿64Byte後觸發 Cmd TX將 資料發射出去

			RFLIB_StrobeCmd(CMD_TX); //entry tx & transmit
			Delay10us(1);
			while(RF_Flag == 0); //wait transmit completed
			Delay10ms(1);

    3.    相反的RX端,會先啟動Cmd RX,等待對方Tx發射過來的資料,將它收下來,收完資料後,會將資料依序填入 SBUF,將資料將從A8137的Uart TX輸出

			RFLIB_StrobeCmd(CMD_RX);
			Delay10us(1);
			while(RF_Flag == 0); //wait receive completed

			RxPacket();
			
			if(P3_2==1)
			{
				UartSendCnt=64;
				Uartptr =& Tmpbuf[0];
				SBUF=Tmpbuf[0];
				while(UartSendCnt);
			}


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。