Amiccom RF IC Direct mode介紹(以A7130為例)
- 本篇介紹Amiccom A7130 RF IC Direct mode TX/RX使用方法與原理 
- Direct mode的用意只是方便使用者可以直接從GIO Pin Follow CKO Clock(DataRate Clock),送/收 customized packet in ("bit" sequence資料)簡稱raw data bit, 
換句話說,也就是raw data需跟隨CKO Clock的正緣( rising edge ) 才能做TX Data輸入至GIO1(TRXD) Pin的行為,如下圖:
注意下圖GIO2 Pin,需設為TMEO(Tx Modulation Enable Output),Raw data"必需"要在Tx Modulation Enable後(A7130 GIO2 Pin Go High)才可以開始將Data送至A7130 GIO1 pin(TRXD),且TX端需自行建立Preamble Code(0x55,0x55,0x55,0x55) & ID Code(ex:0x34,0x75,0xC5,0x2A)的Raw data bit

反之Rx部分是在CKO負緣( falling edge )時做接收Raw Data行為,如下圖:
RX端也是需要掃描到ID Code,A7130 GIO2=Fsync Go High後,A7130才會起震CKO ,Data就由A7130 GIO1(TRXD)輸出接收到的raw data

底下以Amiccom A9139M0核MCU當主控,控制A7130做TX/RX Direct mode介紹
代碼:<TX/RX測試版: A7130-F09(A9139M0F7) - 0628_2450_001Mhz_Direct modeTRX_500Kbps_Rx_sensitivity94dbm.zip>
A7130-F09(A9139M0F7) - 0628_2450_001Mhz_Direct modeTRX_500Kbps_Rx_sensitivity94dbm.zip>
TX端:
I/O介紹:
| A9139M0 MCU端 | A7130 Module | 
| P0.4(Input mode) | GIO1(Output mode)=TMEO | 
| P0.5(OutPut mode)=Raw Data | GIO2(InPut mode)=Data pin | 
| P0.3(Input mode) | CKO(OutPut mode)=DataRate Clock | 
1. 使用者可以直接使用A7130的FIFO Config調整FMS bit=0,即可切換至Direct mode
A7130_WriteReg(MODECTRL_REG,0x60);

2. 將GIO1設為TMEO
A7130_WriteReg(GPIO1_REG, 0x09);//GIO1=TMEO,
3. 需要將GIO2 其中一隻Pin 設為TXD(Direct TX端)/RXD(Direct Rx端),這邊建議因為應用上可能會有TX/RX交替雙向傳輸的需求,因此建議可以直接設成[0111]=TRXD模式
A7130_WriteReg(GPIO2_REG, 0x9D);//GIO2=TRXD

3. 將CKO設為,DCK(Direct TX)/RCK(Direct RX)
A7130_WriteReg(CKO_REG, 0x02);//CKO Enable,CKO=DCK/RCK

4. 下TX CMD
StrobeCmd(CMD_TX); //entry tx & transmit
5.     等待GIO1(TMEO) Go High,這裡是將A7130的GIO1 pin(Output)接到MCU的P0.4(Input),因此MCU P0.4會去判斷A7130 GIO1是否輸出為HIGH,為high表示A7130 tx modulation enable
while(GPIO0->DATA_PIN.P04==0);
6. MCU開始Read CKO Clock,發送Preamble Code至A7130 TX端的GIO2 Pin(TRXD)
SandOneByteData(0x55); SandOneByteData(0x55); SandOneByteData(0x55); SandOneByteData(0x55);
SandOneByteData function:
void SandOneByteData(Uint8 Data)
{
	Uint8 i;
	for(i=0; i<8; i++)
    {	
	while(CKO==1);//MCU Input Read A7130 CKO Pin state	
            if(Data & 0x80)
                GIO2 = 1;//MCU Output=1
            else
                GIO2 = 0;//MCU Output=0
        Data<<=1;
	while(CKO==0);//MCU Input Read A7130 CKO Pin state
    }
}7. 發送4Byte ID Code
//ID SandOneByteData(0x34); SandOneByteData(0x75); SandOneByteData(0xC5); SandOneByteData(0x2A);
8. Send Payload Data
SandData(PN9_Tab,64);
SandData function:Data GIO2 Pin follow CKO Pin Low->high(rising edge)時,輸入資料
void SandData(Uint8 *p, Uint8 cnt)
{
	Uint8 i,j;
	Uint8 Data;
	for(j=0; j<cnt; j++)
	{
		Data=*p;
		for(i=0; i<8; i++)
		{
			while(CKO==1);//MCU Input Read A7130 CKO Pin state
			if(Data & 0x80)
				GIO2 = 1;//MCU Output=1
			else
				GIO2 = 0;//MCU Output=0
			Data<<=1;
			while(CKO==0);//MCU Input Read A7130 CKO Pin state
		}
		p++;
	}
	i=0;
}9. 發送完data,手動下Standby CMD結束TX行為
StrobeCmd(CMD_STBY);
RX端:
I/O介紹
| A9139M0 MCU端 | A7130 Module | 
| P0.4(Input mode) | GIO1(Output mode)=Fsync | 
| P0.5(Input mode)=Data Pin | GIO2(OutPut mode)=Raw Data | 
| P0.3(Input mode) | CKO(OutPut mode) | 
1. 使用者可以直接使用A7130的FIFO Config調整FMS bit=0,即可切換至Direct mode
A7130_WriteReg(MODECTRL_REG,0x60);
2. 設定A7130 GIO1=Fsync mode
A7130_WriteReg(GPIO1_REG, 0x05);//GIO1=FSYNC,
3.    設定A7130 GIO2=TRXD mode
A7130_WriteReg(GPIO2_REG, 0x9D);//GIO2=TRXD
4.    設定A7130 CKO=DCK/RCK mode
A7130_WriteReg(CKO_REG, 0x02);//CKO=DCK
5. 下RX CMD進入RX Mode
StrobeCmd(CMD_RX);
6.    Waiting ID Code sync GIO1 Go High
while(GIO1==0);
7. Fsync成功後,開始讀資料,follow CKO Pin high->low(falling edge)
ReadData(tmpbuf,64);
ReadData function:
MCU P0.5(GIO2IN)=Input mode Read A7130 GIO2 Pin Output Data follow CKO Clock
void ReadData(Uint8 *p, Uint8 cnt)
{ 
	Uint8 Data=0;
	Uint8 i,j,src;
	
	src=0;
	for(j=0;j<cnt;j++)
	{
		for(i=0;i<8;i++)
		{
			while(CKO==0);
			if(GIO2IN==1)
			{
				src=(src<<1)|0x01;
			}
			else
			{
				src=src<<1;
			}
			
			while(CKO==1);
			
		}
		*p=src;
		p++;
	}
	src=0;
	
}8. 接收完data,手動下Standby CMD結束RX行為
StrobeCmd(CMD_STBY);
