分享一個收集到的完整版的SI4432的源碼與開發文檔等資料。這個是我自己做過實驗的完善的可行的版本。
程序功能可以發也可以收,平時處于檢測接收,有信號就會接收。而當檢測到按鍵后發送數據LED燈閃爍,對應另一方收到數據后判斷是否正確,數據正確LED閃爍。并發送返回數據。依次循環
SI4432-彈簧-1.JPG (98.59 KB, 下載次數: 45)
下載附件
2018-8-29 16:48 上傳
SI4432-SMA天線.JPG (76.1 KB, 下載次數: 34)
下載附件
2018-8-29 16:48 上傳
1117使用說明.JPG (41.77 KB, 下載次數: 49)
下載附件
2018-8-29 16:48 上傳
單片機源程序如下:
- /*
- Demo 程序適用范圍: Si4431F13, Si4432F20, Si4431F27
- RF 模塊的參數設置為: FSK, 433.5MHz, 1.2KBPS, +/-10PPM, 頻偏:30KHz, 調制帶寬:61.2KHz
- 使能AFC,使能CRC, PH + FIFO 模式, 頭碼:"swwx", 同步字: 0x2d 0xd4
- 每秒鐘發射的固定測試數據為:
- 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x6d,
- 0x6d是發生數據的 CheckSum, 0x6d = (0x41 +0x42 +0x43 +0x44 +0x45 +0x46 +0x47 + 0x48 +0x49)
- 控制MCU : 8 bit MCU :STC89C52, 11.0592MHZ
- */
- #include <reg52.h> //52寄存器
- #include<math.h>
- #include <intrins.h>
- #define SI4432_PWRSTATE_READY 01 // 模塊 Ready 狀態定義
- #define SI4432_PWRSTATE_TX 0x09 // 模塊 發射狀態定義
- #define SI4432_PWRSTATE_RX 05 // 模塊 接收狀態定義
- #define SI4432_PACKET_SENT_INTERRUPT 04 // 模塊 發射完成中斷
- #define SI4432_Rx_packet_received_interrupt 0x02 // 模塊 收到數據包中斷
- #define TX1_RX0 spi_rw(0x0e|0x80, 0x01) // 發射狀態的天線開關定義
- #define TX0_RX1 spi_rw(0x0e|0x80, 0x02) // 接收狀態的天線開關定義
- #define TX0_RX0 spi_rw(0x0e|0x80, 0x00) // 非發射,接收狀態的天線開關定義
- //========================================SI4432與MCU連接========================================
- sbit SDN = P3^3;
- sbit nIRQ = P1^4;
- sbit nSEL = P1^3;
- sbit SCK = P1^2;
- sbit SDI = P1^1;
- sbit SDO = P1^0;
- //========================================按鍵端口===============================================
- sbit KEY = P3^6;
- //========================================LED顯示端口============================================
- sbit LED = P3^4;
- unsigned char ItStatus1, ItStatus2;
- unsigned char rf_timeout;
- unsigned char rx_buf[15];
- // 檢測到按鍵后發射的固定內容的測試信號,第10個數據是前9個數據的校驗和
- const unsigned char tx_test_data[10] = {0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x6d};
- //===============================================================================================
- typedef struct
- {
-
- unsigned char reach_1s : 1;
- unsigned char rf_reach_timeout : 1;
- unsigned char is_tx : 1;
-
-
- } FlagType;
- FlagType Flag;
- //==============================================函數申明===========================================
- void delay_1ms(unsigned char time);
- unsigned char spi_byte(unsigned char TRdata);
- unsigned char spi_rw(unsigned char addr, unsigned char TRdata);
- void rx_data(void);
- void tx_data(void);
- void SI4432_init(void);
- //================================================延時函數=========================================
- void delay_1ms(unsigned char time)
- {
- unsigned char i,k;
- for(k = 0; k< time; k++)
- {
- for(i = 0; i<130; i++)
- {
- _nop_();
- }
- }
- }
- //===============================================SPI讀寫函數=======================================
- unsigned char spi_byte(unsigned char TRdata)
- {
- unsigned char i;
-
- for (i = 0; i < 8; i++) // 控制SCK 和 SDI,發射一個字節的命令,同事讀取1個字節的數據
- { // 沒有包括nSEL的控制
- if (TRdata & 0x80)
- SDI = 1;
- else
- SDI = 0;
-
- TRdata <<= 1;
- SCK = 1;
-
- if (SDO)
- TRdata |= 0x01;
- else
- TRdata &= 0xfe;
-
- SCK = 0;
- }
-
- return (TRdata);
- }
- //-------------------------------------------對寄存器讀寫操作===========================================
- unsigned char spi_rw(unsigned char addr, unsigned char TRdata)
- {
- unsigned char i;
-
- SCK = 0;
- nSEL = 0;
-
- for (i = 0; i < 8; i++)
- {
- if (addr & 0x80)
- SDI = 1;
- else
- SDI = 0;
- addr <<= 1;
- SCK = 1;
- _nop_();
- SCK = 0;
- }
- //======================================================================================================
- for (i = 0; i < 8; i++)
- {
- if (TRdata & 0x80)
- SDI = 1;
- else
- SDI = 0;
- TRdata <<= 1;
- SCK = 1;
- if (SDO)
- TRdata |= 0x01;
- else
- TRdata &= 0xfe;
- SCK = 0;
- }
- nSEL = 1;
- SCK = 1;
- return (TRdata);
- }
- //=========================================接收數據================================================
-
- void rx_data(void)
- {
- Flag.is_tx = 0;
- spi_rw(0x07|0x80, SI4432_PWRSTATE_READY); //進入 Ready 模式
- delay_1ms(5);
- TX0_RX1; // 設置天線開關
- spi_rw(0x08|0x80, 0x03); //清發射,接收緩沖區
- spi_rw(0x08|0x80, 0x00); //清發射,接收緩沖區
-
- spi_rw(0x07|0x80,SI4432_PWRSTATE_RX ); // RF 模塊進入接收模式
-
- spi_rw(0x05|0x80, SI4432_Rx_packet_received_interrupt); // RF模塊收到整包數據后,產生中斷
-
- ItStatus1 = spi_rw(0x03,0x00); //清掉現有的中斷標志
- ItStatus2 = spi_rw(0x04,0x00); //清掉現有的中斷標志
-
- }
- //=========================================發送數據================================================
- void tx_data(void)
- {
- unsigned char i;
-
- Flag.is_tx = 1;
- spi_rw(0x07|0x80, SI4432_PWRSTATE_READY); // rf 模塊進入Ready 模式
- TX1_RX0; //設置天線開關的方向
-
- delay_1ms(5); // 延時 5ms, 讓系統穩定
-
- spi_rw(0x08|0x80, 0x03); //
- spi_rw(0x08|0x80, 0x00); // 清發射,接收緩沖區
-
- spi_rw(0x34|0x80, 40); // 發射40個Nibble 的前導碼
- spi_rw(0x3e|0x80, 10); // 總共發射10個字節的數據
- for (i = 0; i<10; i++)
- {
- spi_rw(0x7f|0x80, tx_test_data[i]); // 將要發射的數據載入緩沖區
- }
- spi_rw(0x05|0x80, SI4432_PACKET_SENT_INTERRUPT); // 整包數據發射完后,產生中斷
- ItStatus1 = spi_rw(0x03,0x00); // 清RF模塊中斷
- ItStatus2 = spi_rw(0x04,0x00);
- spi_rw(0x07|0x80, SI4432_PWRSTATE_TX); // 進入發射模式
- // delay_1ms(5);
- rf_timeout = 0;
- Flag.rf_reach_timeout = 0;
- nIRQ=1;
- while(nIRQ) // 等待中斷
- {
-
- if(Flag.rf_reach_timeout)
- {
-
- SDN = 1; //如果0.5秒還沒有中斷,則RF模塊工作不正常,重新復位并初始化模塊
- delay_1ms(10);
- SDN = 0;
- delay_1ms(200);
-
- SI4432_init();
- break; // 則強制跳出
- }
-
- }
-
- // rx_data(); //rf 發射完成,進入接收模式
- }
- //==========================================================================================================
- void SI4432_init(void)
- {
-
- ItStatus1 = spi_rw(0x03,0x00); // 清RF模塊中斷
- ItStatus2 = spi_rw(0x04,0x00);
-
- spi_rw(0x06|0x80, 0x00); // 關閉不需要的中斷
-
- spi_rw(0x07|0x80, SI4432_PWRSTATE_READY); // 進入 Ready 模式
-
- spi_rw(0x09|0x80, 0x7f); // 負載電容= 12P
- spi_rw(0x0a|0x80, 0x05); // 關閉低頻輸出
- spi_rw(0x0b|0x80, 0xea); // GPIO 0 當做普通輸出口
- spi_rw(0x0c|0x80, 0xea); // GPIO 1 當做普通輸出口
- spi_rw(0x0d|0x80, 0xf4); // GPIO 2 輸出收到的數據
-
- spi_rw(0x70|0x80, 0x2c); // 下面的設置根據Silabs 的Excel
- spi_rw(0x1d|0x80, 0x40); // 使能 afc
-
- //======================================1.2K bps setting start===============================================
- spi_rw(0x1c|0x80, 0x16);
-
- spi_rw(0x20|0x80, 0x83);
- spi_rw(0x21|0x80, 0xc0);
- spi_rw(0x22|0x80, 0x13);
- spi_rw(0x23|0x80, 0xa9);
- spi_rw(0x24|0x80, 0x00);
- spi_rw(0x25|0x80, 0x04);
-
- spi_rw(0x2a|0x80, 0x14);
- spi_rw(0x6e|0x80, 0x09);
- spi_rw(0x6f|0x80, 0xd5);
- //=====================================1.2K bps setting end ===============================================
- spi_rw(0x30|0x80, 0x8c); // 使能PH+ FIFO模式,高位在前面,使能CRC校驗
-
- spi_rw(0x32|0x80, 0xff); // byte0, 1,2,3 作為頭碼
-
- spi_rw(0x33|0x80, 0x42);// byte 0,1,2,3 是頭碼,同步字3,2 是同步字
-
- spi_rw(0x34|0x80, 16); // 發射16個Nibble的Preamble
- spi_rw(0x35|0x80, 0x20); // 需要檢測4個nibble的Preamble
- spi_rw(0x36|0x80, 0x2d); // 同步字為 0x2dd4
- spi_rw(0x37|0x80, 0xd4);
- spi_rw(0x38|0x80, 0x00);
- spi_rw(0x39|0x80, 0x00);
- spi_rw(0x3a|0x80, 's'); // 發射的頭碼為: “swwx"
- spi_rw(0x3b|0x80, 'w');
- spi_rw(0x3c|0x80, 'w');
- spi_rw(0x3d|0x80, 'x');
- spi_rw(0x3e|0x80, 10); // 總共發射10個字節的數據
- spi_rw(0x3f|0x80, 's'); // 需要校驗的頭碼為:”swwx"
- spi_rw(0x40|0x80, 'w');
- spi_rw(0x41|0x80, 'w');
- spi_rw(0x42|0x80, 'x');
- spi_rw(0x43|0x80, 0xff); // 頭碼1,2,3,4 的所有位都需要校驗
- spi_rw(0x44|0x80, 0xff); //
- spi_rw(0x45|0x80, 0xff); //
- spi_rw(0x46|0x80, 0xff); //
- spi_rw(0x6d|0x80, 0x07); // 設置為最大功率發射
- spi_rw(0x79|0x80, 0x0); // 不需要跳頻
- spi_rw(0x7a|0x80, 0x0); // 不需要跳頻
-
- spi_rw(0x71|0x80, 0x22); // 發射不需要 CLK,FiFo , FSK模式
-
- spi_rw(0x72|0x80, 0x30); // 頻偏為 30KHz
- spi_rw(0x73|0x80, 0x0); // 沒有頻率偏差
- spi_rw(0x74|0x80, 0x0); // 沒有頻率偏差
-
- spi_rw(0x75|0x80, 0x53); // 頻率設置 434
- spi_rw(0x76|0x80, 0x57); //
- spi_rw(0x77|0x80, 0x80);
- }
- //=================================================主函數==========================================
- void main()
- {
-
- unsigned char i, chksum;
- SDN = 1;
- delay_1ms(10); // RF 模塊上電復位
- SDN = 0;
- delay_1ms(200); // 延時200ms RF 模塊進入工作狀態
- SI4432_init(); // RF 模塊初始化
- TX0_RX0; // 天線開關不在發射,接收狀態
- rx_data();
- Flag.reach_1s = 0;
- while(1)
- {
- if(KEY==0)
- {
- // Flag.reach_1s = 0;
- tx_data(); // 每間隔一段時間,發射一包數據,并接收 Acknowledge 信號
- LED=0; delay_1ms(200); LED=1 ; delay_1ms(200);
- rx_data(); //rf 發射完成,進入接收模式
- }
- if(!Flag.is_tx)
-
- {
- nIRQ=1;
- if(!nIRQ)
- {
- ItStatus1 = spi_rw(0x03,0x00); // 清中斷 //read the Interrupt Status1 register
- ItStatus2 = spi_rw(0x04,0x00); // 清中斷
-
- SCK = 0;
- nSEL = 0;
- spi_byte(0x7f); // 從緩沖區讀數據
- for(i = 0;i<10;i++)
- {
- rx_buf[i] = spi_byte(0x00);
- }
- nSEL = 1;
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (46.24 KB, 下載次數: 39)
下載附件
2018-8-29 16:49 上傳
所有資料51hei提供下載:
SI4432無線評估開發包.rar
(1.5 MB, 下載次數: 68)
2018-8-29 08:51 上傳
點擊文件名下載附件
開發全部包括程序 下載積分: 黑幣 -5
|