【單片機】SI4432 Based Networking 2

編寫一個簡單地碰撞檢測示例程序:

void RF_SendProcedure_CSMA_CA(void)
{
	static const u8 random_withdraw_time_table[] = {5,22,19,14,12,20,9,10,6,11,7,13,8,23,25,17,16,21,24,18};
	static u8 random_withdraw_time_select = 0;
	SI4432_SwitchState(SI4432_STATE_RX);
	int timeout = 500;
	printf("%d\r\n",SI4432_RSSI());
	while(CCA == CCA_FAILED)
	{
//		printf("%d ",SI4432_RSSI());
		LED = ~LED;
		delay_ms(random_withdraw_time_table[random_withdraw_time_select]);
		timeout -= random_withdraw_time_table[random_withdraw_time_select];
		if(timeout < 0)
			break;
		random_withdraw_time_select++;
		if(random_withdraw_time_select == sizeof(random_withdraw_time_table) / sizeof(random_withdraw_time_table[0]))
			random_withdraw_time_select = 0;
	}
	LED = 1;
	if(timeout < 0)
	{
		printf("CCA timeout\r\n");
	}
	else
	{
		SI4432_TxState(SI4432_STATE_IDLE_READY);
	}
}

程序中直接判斷CCA引腳的狀態,如果爲1表示信道忙,則進行隨機退避,隨機數使用的簡單的隨機數表,網頁工具:http://www.99cankao.com/numbers/random-number-generator.php

主程序收到串口發來的 ‘a’ 字符的時候發送一次數據。

	while(1)
	{
		if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET)
			USART_ClearFlag(USART1,USART_FLAG_ORE);

		if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == SET)
		{
			uart_data = USART_ReceiveData(USART1);
			if(uart_data == 'a')
			{
				printf("Send:%d\t",++sent);
//				SI4432_TxState(SI4432_STATE_IDLE_READY);
				RF_SendProcedure_CSMA_CA();
				SI4432_SwitchState(SI4432_STATE_RX);
			}
			else
			{
				sent = 0;
				got = 0;
			}
		}
		if(SI4432_Flags & SI4432_FLAGS_NEW_PACKAGE)
		{
			SI4432_Flags &= ~SI4432_FLAGS_NEW_PACKAGE;
			printf("Got:%d\r\n",++got);
			SI4432_FETCH_DATA();
		}
//		delay_ms(100);
	}

在後再來一個 “攪屎棍” :

這個 “攪屎棍” 設備沒什麼其它任務,高速循環發送數據即可,注意修改發送頭碼,不要和那兩個節點的接收頭碼相同:

	while(1)
	{
		printf("a");
		SI4432_TX_MODE();
		delay_ms(10);
	}

“攪屎棍” 啓動之前,兩個節點的互相通訊是沒有問題的,而且發送的時候RSSI的值都是正常值(信道通暢):

啓動 “攪屎棍” 之後,的確有衝突現象發生(LED閃爍表示衝突退避),而且衝突退避算法有效果,收發都沒有丟包:


有奇怪的偶然發生的現象發生,隨機斷開兩個節點或者 “攪屎棍” 會發生兩個節點發送不出去數據,信道一直處於忙碌狀態,或者是一個節點1可以發送出去數據,節點2收不到數據(幾乎收不到,發送500個收到6個),但是節點2發送數據節點1是能收到的,拔掉 “攪屎棍” 的電源,一切恢復正常。奇怪。還有件奇怪的事情,發送數據的時候我的耳機裏面偶然會有非常微弱呲呲的聲音(合適的角度認真聽才聽到),耳機的音圈盡然收到了433Mhz的信號了?還是電腦裏面的某些器件收到信號了?

雖然有一個簡單的衝突檢測功能,但是還是需要應答的功能,設計一個簡單的數據交互方式:

struct transaction
{
	struct transaction *next;
	int tid;    
	int flag;
	int status;
	u8 *tx_buff;
	u8 *rx_buff;
};

每一個傳輸都以 transaction(事務) 爲最小單位:

還有不少沒考慮到的細節,可以繼續優化,具體的軟件程序就不在這更新了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章