使用UART輸入 FIFO Data給A8137 Tx發射,再由對端的A8137 RX接收後,經過Rx端的UART解析出來
系統概念圖
代碼:
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
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); }