|
分享一個(gè)收集到的完整版的SI4432的源碼與開(kāi)發(fā)文檔等資料。這個(gè)是我自己做過(guò)實(shí)驗(yàn)的完善的可行的版本。
程序功能可以發(fā)也可以收,平時(shí)處于檢測(cè)接收,有信號(hào)就會(huì)接收。而當(dāng)檢測(cè)到按鍵后發(fā)送數(shù)據(jù)LED燈閃爍,對(duì)應(yīng)另一方收到數(shù)據(jù)后判斷是否正確,數(shù)據(jù)正確LED閃爍。并發(fā)送返回?cái)?shù)據(jù)。依次循環(huán)
單片機(jī)源程序如下:
- /*
- Demo 程序適用范圍: Si4431F13, Si4432F20, Si4431F27
- RF 模塊的參數(shù)設(shè)置為: FSK, 433.5MHz, 1.2KBPS, +/-10PPM, 頻偏:30KHz, 調(diào)制帶寬:61.2KHz
- 使能AFC,使能CRC, PH + FIFO 模式, 頭碼:"swwx", 同步字: 0x2d 0xd4
- 每秒鐘發(fā)射的固定測(cè)試數(shù)據(jù)為:
- 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x6d,
- 0x6d是發(fā)生數(shù)據(jù)的 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 狀態(tài)定義
- #define SI4432_PWRSTATE_TX 0x09 // 模塊 發(fā)射狀態(tài)定義
- #define SI4432_PWRSTATE_RX 05 // 模塊 接收狀態(tài)定義
- #define SI4432_PACKET_SENT_INTERRUPT 04 // 模塊 發(fā)射完成中斷
- #define SI4432_Rx_packet_received_interrupt 0x02 // 模塊 收到數(shù)據(jù)包中斷
- #define TX1_RX0 spi_rw(0x0e|0x80, 0x01) // 發(fā)射狀態(tài)的天線開(kāi)關(guān)定義
- #define TX0_RX1 spi_rw(0x0e|0x80, 0x02) // 接收狀態(tài)的天線開(kāi)關(guān)定義
- #define TX0_RX0 spi_rw(0x0e|0x80, 0x00) // 非發(fā)射,接收狀態(tài)的天線開(kāi)關(guān)定義
- //========================================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];
- // 檢測(cè)到按鍵后發(fā)射的固定內(nèi)容的測(cè)試信號(hào),第10個(gè)數(shù)據(jù)是前9個(gè)數(shù)據(jù)的校驗(yàn)和
- 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;
- //==============================================函數(shù)申明===========================================
- 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);
- //================================================延時(shí)函數(shù)=========================================
- void delay_1ms(unsigned char time)
- {
- unsigned char i,k;
- for(k = 0; k< time; k++)
- {
- for(i = 0; i<130; i++)
- {
- _nop_();
- }
- }
- }
- //===============================================SPI讀寫函數(shù)=======================================
- unsigned char spi_byte(unsigned char TRdata)
- {
- unsigned char i;
-
- for (i = 0; i < 8; i++) // 控制SCK 和 SDI,發(fā)射一個(gè)字節(jié)的命令,同事讀取1個(gè)字節(jié)的數(shù)據(jù)
- { // 沒(méi)有包括nSEL的控制
- if (TRdata & 0x80)
- SDI = 1;
- else
- SDI = 0;
-
- TRdata <<= 1;
- SCK = 1;
-
- if (SDO)
- TRdata |= 0x01;
- else
- TRdata &= 0xfe;
-
- SCK = 0;
- }
-
- return (TRdata);
- }
- //-------------------------------------------對(duì)寄存器讀寫操作===========================================
- 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);
- }
- //=========================================接收數(shù)據(jù)================================================
-
- void rx_data(void)
- {
- Flag.is_tx = 0;
- spi_rw(0x07|0x80, SI4432_PWRSTATE_READY); //進(jìn)入 Ready 模式
- delay_1ms(5);
- TX0_RX1; // 設(shè)置天線開(kāi)關(guān)
- spi_rw(0x08|0x80, 0x03); //清發(fā)射,接收緩沖區(qū)
- spi_rw(0x08|0x80, 0x00); //清發(fā)射,接收緩沖區(qū)
-
- spi_rw(0x07|0x80,SI4432_PWRSTATE_RX ); // RF 模塊進(jìn)入接收模式
-
- spi_rw(0x05|0x80, SI4432_Rx_packet_received_interrupt); // RF模塊收到整包數(shù)據(jù)后,產(chǎn)生中斷
-
- ItStatus1 = spi_rw(0x03,0x00); //清掉現(xiàn)有的中斷標(biāo)志
- ItStatus2 = spi_rw(0x04,0x00); //清掉現(xiàn)有的中斷標(biāo)志
-
- }
- //=========================================發(fā)送數(shù)據(jù)================================================
- void tx_data(void)
- {
- unsigned char i;
-
- Flag.is_tx = 1;
- spi_rw(0x07|0x80, SI4432_PWRSTATE_READY); // rf 模塊進(jìn)入Ready 模式
- TX1_RX0; //設(shè)置天線開(kāi)關(guān)的方向
-
- delay_1ms(5); // 延時(shí) 5ms, 讓系統(tǒng)穩(wěn)定
-
- spi_rw(0x08|0x80, 0x03); //
- spi_rw(0x08|0x80, 0x00); // 清發(fā)射,接收緩沖區(qū)
-
- spi_rw(0x34|0x80, 40); // 發(fā)射40個(gè)Nibble 的前導(dǎo)碼
- spi_rw(0x3e|0x80, 10); // 總共發(fā)射10個(gè)字節(jié)的數(shù)據(jù)
- for (i = 0; i<10; i++)
- {
- spi_rw(0x7f|0x80, tx_test_data[i]); // 將要發(fā)射的數(shù)據(jù)載入緩沖區(qū)
- }
- spi_rw(0x05|0x80, SI4432_PACKET_SENT_INTERRUPT); // 整包數(shù)據(jù)發(fā)射完后,產(chǎn)生中斷
- ItStatus1 = spi_rw(0x03,0x00); // 清RF模塊中斷
- ItStatus2 = spi_rw(0x04,0x00);
- spi_rw(0x07|0x80, SI4432_PWRSTATE_TX); // 進(jìn)入發(fā)射模式
- // delay_1ms(5);
- rf_timeout = 0;
- Flag.rf_reach_timeout = 0;
- nIRQ=1;
- while(nIRQ) // 等待中斷
- {
-
- if(Flag.rf_reach_timeout)
- {
-
- SDN = 1; //如果0.5秒還沒(méi)有中斷,則RF模塊工作不正常,重新復(fù)位并初始化模塊
- delay_1ms(10);
- SDN = 0;
- delay_1ms(200);
-
- SI4432_init();
- break; // 則強(qiáng)制跳出
- }
-
- }
-
- // rx_data(); //rf 發(fā)射完成,進(jìn)入接收模式
- }
- //==========================================================================================================
- void SI4432_init(void)
- {
-
- ItStatus1 = spi_rw(0x03,0x00); // 清RF模塊中斷
- ItStatus2 = spi_rw(0x04,0x00);
-
- spi_rw(0x06|0x80, 0x00); // 關(guān)閉不需要的中斷
-
- spi_rw(0x07|0x80, SI4432_PWRSTATE_READY); // 進(jìn)入 Ready 模式
-
- spi_rw(0x09|0x80, 0x7f); // 負(fù)載電容= 12P
- spi_rw(0x0a|0x80, 0x05); // 關(guān)閉低頻輸出
- spi_rw(0x0b|0x80, 0xea); // GPIO 0 當(dāng)做普通輸出口
- spi_rw(0x0c|0x80, 0xea); // GPIO 1 當(dāng)做普通輸出口
- spi_rw(0x0d|0x80, 0xf4); // GPIO 2 輸出收到的數(shù)據(jù)
-
- spi_rw(0x70|0x80, 0x2c); // 下面的設(shè)置根據(jù)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校驗(yàn)
-
- 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); // 發(fā)射16個(gè)Nibble的Preamble
- spi_rw(0x35|0x80, 0x20); // 需要檢測(cè)4個(gè)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'); // 發(fā)射的頭碼為: “swwx"
- spi_rw(0x3b|0x80, 'w');
- spi_rw(0x3c|0x80, 'w');
- spi_rw(0x3d|0x80, 'x');
- spi_rw(0x3e|0x80, 10); // 總共發(fā)射10個(gè)字節(jié)的數(shù)據(jù)
- spi_rw(0x3f|0x80, 's'); // 需要校驗(yàn)的頭碼為:”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 的所有位都需要校驗(yàn)
- spi_rw(0x44|0x80, 0xff); //
- spi_rw(0x45|0x80, 0xff); //
- spi_rw(0x46|0x80, 0xff); //
- spi_rw(0x6d|0x80, 0x07); // 設(shè)置為最大功率發(fā)射
- spi_rw(0x79|0x80, 0x0); // 不需要跳頻
- spi_rw(0x7a|0x80, 0x0); // 不需要跳頻
-
- spi_rw(0x71|0x80, 0x22); // 發(fā)射不需要 CLK,F(xiàn)iFo , FSK模式
-
- spi_rw(0x72|0x80, 0x30); // 頻偏為 30KHz
- spi_rw(0x73|0x80, 0x0); // 沒(méi)有頻率偏差
- spi_rw(0x74|0x80, 0x0); // 沒(méi)有頻率偏差
-
- spi_rw(0x75|0x80, 0x53); // 頻率設(shè)置 434
- spi_rw(0x76|0x80, 0x57); //
- spi_rw(0x77|0x80, 0x80);
- }
- //=================================================主函數(shù)==========================================
- void main()
- {
-
- unsigned char i, chksum;
- SDN = 1;
- delay_1ms(10); // RF 模塊上電復(fù)位
- SDN = 0;
- delay_1ms(200); // 延時(shí)200ms RF 模塊進(jìn)入工作狀態(tài)
- SI4432_init(); // RF 模塊初始化
- TX0_RX0; // 天線開(kāi)關(guān)不在發(fā)射,接收狀態(tài)
- rx_data();
- Flag.reach_1s = 0;
- while(1)
- {
- if(KEY==0)
- {
- // Flag.reach_1s = 0;
- tx_data(); // 每間隔一段時(shí)間,發(fā)射一包數(shù)據(jù),并接收 Acknowledge 信號(hào)
- LED=0; delay_1ms(200); LED=1 ; delay_1ms(200);
- rx_data(); //rf 發(fā)射完成,進(jìn)入接收模式
- }
- 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); // 從緩沖區(qū)讀數(shù)據(jù)
- for(i = 0;i<10;i++)
- {
- rx_buf[i] = spi_byte(0x00);
- }
- nSEL = 1;
-
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
SI4432無(wú)線評(píng)估開(kāi)發(fā)包.rar
(1.5 MB, 下載次數(shù): 68)
2018-8-29 08:51 上傳
點(diǎn)擊文件名下載附件
開(kāi)發(fā)全部包括程序
|
評(píng)分
-
查看全部評(píng)分
|