|
本帖最后由 huyun 于 2015-6-4 14:13 編輯
最近想做無線遙控,選用SI4432這個(gè)模塊,因?yàn)檫@個(gè)芯片需要配置的寄存器比較多,調(diào)試的時(shí)候遇到了很多困難,在網(wǎng)上搜索了很久沒找到幾篇好的文章。曾多方求助,經(jīng)過幾天的努力終于將該模塊調(diào)試成功。在此隨筆寫些調(diào)試的主要步驟希望給其他開始學(xué)SI4432的人一些幫助。另外,本人菜鳥一枚,寫這篇文章目的在于避免其他新手像我一樣無助,請(qǐng)大家多提寶貴意見,共同進(jìn)步!歡迎轉(zhuǎn)載。
好了,開始。
一、無線模塊選型。
根據(jù)無線通訊的頻段,平常用的無線模塊主要有315MHZ,433MHZ,2.4GHZ。2.4G最近貌似比較火,像24L01,好多開發(fā)板上都配這一款芯片。433MHZ頻段的模塊常用的有NRF905、CC1101、SI4432。在315MHZ頻段好像做普通的遙控器比較多,像超外差模塊。
本人想做無線通信,選擇在2.4GHZ和433MHZ之間。說下區(qū)別,2.4G無線通信頻率高、波長(zhǎng)短、傳輸速率高、繞射能力差、通信距離短。網(wǎng)上賣的模塊不加功率放大也就是一百米以內(nèi)。433MHZ無線通信頻率低、波長(zhǎng)較長(zhǎng)、傳輸速率低、繞射能力強(qiáng)、通信距離遠(yuǎn)。價(jià)格和2.4GHZ模塊相當(dāng),但是距離一般在幾百米甚至更遠(yuǎn),據(jù)說加上功率放大可達(dá)一兩千米。本人想用來遙控智能車,通信數(shù)據(jù)量不大,但是想讓距離遠(yuǎn)一點(diǎn)。所以選擇433MHZ模塊,具體型號(hào)是SI4432。
二、初次接觸SI4432
該芯片價(jià)格低、傳輸距離遠(yuǎn),網(wǎng)上用的人挺多的。曾經(jīng)找過一些資料發(fā)現(xiàn)很多商業(yè)上的無線通信也是用這一款。于是在網(wǎng)上買了一對(duì),加運(yùn)費(fèi)一共四十多。沒有廣告嫌疑,感興趣自己搜。買回來之后開始看相關(guān)的手冊(cè)和例程。我嘞個(gè)去,需要配置的寄存器真多,而且通訊速率、頻段、前導(dǎo)碼、同步字等等都是自己定義的,大家寫的都不一樣。加上沒有專業(yè)的知識(shí),更是加大難度。 賣家配的資料室51的版本,說實(shí)話程序?qū)懙挠悬c(diǎn)亂,主要是因?yàn)樗麄兊某绦蚴桥涮姿麄兊拈_發(fā)板的,有很多都看不懂。而對(duì)于我們初學(xué)者而言,最需要的卻是最簡(jiǎn)單的:簡(jiǎn)單收發(fā)就行。我使用的控制器型號(hào):STM32F103RB。分析了很久慢慢移植到STM32里面,失敗。多次修改,失敗。在網(wǎng)上搜索,網(wǎng)上雖然用的人多,但是資料甚少。而且一般都是51單片機(jī)驅(qū)動(dòng)的,而且是虛擬SPI!然后是幾天的調(diào)試,不多說。
經(jīng)過幾天的調(diào)試,終于成功,下面說下使用這款芯片的要點(diǎn)。
三、SPI
我用的控制芯片是STM32F103RB。SPI可以軟件模擬,也可以用硬件的。再次,建議大家用硬件的SPI,穩(wěn)定,減少CPU負(fù)擔(dān)。
配置硬件SPI要點(diǎn):
1、速率不要太高,SI4432手冊(cè)上說不要大于10MHZ。
2、MOSI、MOSO、SCK三個(gè)引腳配置為復(fù)用功能推挽輸出。
3、SPI的時(shí)鐘極性配置為:同步時(shí)鐘的空閑狀態(tài)為 低電平
4、SPI的時(shí)鐘的第2個(gè)跳變沿?cái)?shù)據(jù)被采樣。(SPI_CPHA)
5、片選信號(hào)軟件控制,自己定義一個(gè)IO空控制片選吧,方便。
四、硬件連接
STM32和SI4432硬件連接,具體看模塊吧。我簡(jiǎn)單說幾個(gè)比較重要的
1、SI4432的SDN引腳,為高時(shí):芯片停止工作。為低時(shí):芯片允許工作。我買的模塊里,這個(gè)引腳是被引出來的,別費(fèi)勁了,直接接地,不要用IO口控制高低。高手略過。
2、模塊的引腳有些是2.54mm間距,有些是1.27mm。想DIY的朋友注意了,我當(dāng)時(shí)就忘了結(jié)果買了個(gè)1.27mm的后來轉(zhuǎn)接,麻煩了。
3、盡量不要用杜邦線。我開始一直用杜邦線連起來,但是經(jīng)常在發(fā)送和接收的時(shí)候出錯(cuò),初始化正常。后來用洞洞板連起來,正常。
4、SI4432是3.3V供電,電源線和地線盡量和STM32的3.3V和地線連在一起。不然的話容易出錯(cuò),水平有限,不解釋,等高人。
五、軟件調(diào)試
1、SPI配置好以后,向SI4432寫數(shù)據(jù)注意地址最高位置1。 如:SPI1_ReadWriteByte(addr|0x80)
2、 配置好以后,向0X00、0X01、0X02地址讀取,應(yīng)該有返回值,具體看手冊(cè),如果和手冊(cè)上的差不多就證明SPI通訊成功了。
3、 前導(dǎo)碼個(gè)數(shù)。SI4432_WriteReg(0x34, 0X0A); 0x34是向SI4432寫入前導(dǎo)碼的地址,0X0A是個(gè)數(shù),但是表示其一半,也就是5個(gè)字節(jié)。
4、剛開始,不要配置幀頭。直接禁止 SI4432_WriteReg(0x32, 0x00 );// 禁止幀頭
5、SI4432有3個(gè)GPIO,一般自己是不用的,但是依然要配置,因?yàn)檫@個(gè)和模塊相關(guān)。具體問賣家。
6、SI4432主要三個(gè)狀態(tài):接收狀態(tài)、發(fā)送狀態(tài)、掛起狀態(tài)。發(fā)送和接收之間可以相互轉(zhuǎn)換、但是轉(zhuǎn)換之前需要先進(jìn)入掛起狀態(tài)然后至少15ms之后再進(jìn)入發(fā)送或者接收狀態(tài)。程序while(1)之前最好開始就配置為掛起狀態(tài):SI4432_WriteReg(0x07, 0x01);
六、一定要多看官方的程序設(shè)計(jì)指南和芯片的手冊(cè),我會(huì)放到附件里。
以上算是對(duì)SI4432的初步認(rèn)識(shí)和注意事項(xiàng)。但是這些細(xì)節(jié)是比較重要的,因?yàn)橄襁@樣的無線模塊最主要是先實(shí)現(xiàn)通訊,高級(jí)的功能慢慢調(diào)。
具體程序不再分析,我會(huì)放在附件里。STM32F103RB,庫函數(shù)。測(cè)試多次,但是需要根據(jù)自己的模塊進(jìn)行調(diào)整。
快畢業(yè)了,事多,時(shí)間有限,具體看程序,多調(diào)試,多看手冊(cè)。
歡迎多提意見,歡迎轉(zhuǎn)載。
下面是發(fā)送端源代碼:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "spi.h"
- // 0321 注意1:SPI 空閑時(shí)為低電平,第二跳邊沿生效 //注意2:SDN直接接DGND算了
- // 注意3:SI4432和STM32要用同一個(gè)VCC3.3否則的話收到全為0
- #define SI4432_NSEL PAout(4) //SI4432_NSEL 使能
- #define SI4432_SDN PCout(4) //SI4432_SDN 使能
- #define SI4432_NIRQ PCin(5) //SI4432_NIRQ 中斷狀態(tài)
- void SI4432_Init(void) ;
- u8 SI4432_ReadReg(u8 addr) ;
- void SI4432_WriteReg(u8 addr, u8 value) ;
- unsigned char i;
- u8 ItStatus1,ItStatus2,res;
- int main(void)
- {
- delay_init(); //延時(shí)函數(shù)初始化
- NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
- uart_init(9600); //串口初始化為9600
- LED_Init(); //LED端口初始化
- SPI1_Init();
- GPIOSet();
- SI4432_NSEL=0;
- delay_ms(600);
- res = SI4432_ReadReg(0x00);
- delay_ms(20); printf("res =%02x \n",(unsigned short)res );
- res = SI4432_ReadReg(0x01);
- delay_ms(20); printf("res =%02x \n",(unsigned short)res );
- res = SI4432_ReadReg(0x02);
- delay_ms(20); printf("res =%02x \n",(unsigned short)res );
- delay_ms(1000);
- //讀取中斷狀態(tài) 清除中斷 釋放 SI4432_NIRQ
- ItStatus1 = SI4432_ReadReg(0x03);
- ItStatus2 = SI4432_ReadReg(0x04);
- //軟件復(fù)位
- SI4432_WriteReg(0x07, 0x80); //向0X07地址 寫入0X80 軟件復(fù)位
- while ( SI4432_NIRQ == 1);
- //讀取中斷狀態(tài) 清除中斷 釋放 SI4432_NIRQ
- ItStatus1 = SI4432_ReadReg(0x03);
- ItStatus2 = SI4432_ReadReg(0x04);
- /////////////////////////開始設(shè)置
- // 頻率設(shè)置 434
- SI4432_WriteReg(0x75, 0x53);
- SI4432_WriteReg(0x76, 0x64); //
- SI4432_WriteReg(0x77, 0x00);
- // 1.2K bps 發(fā)射速率
- SI4432_WriteReg(0x2a, 0x14);
- SI4432_WriteReg(0x6e, 0x09);
- SI4432_WriteReg(0x6f, 0xd5);
- SI4432_WriteReg(0x70, 0x2c);//
- //SpiWriteRegister(0x72, 0x48); //(9.6kbps)
- SI4432_WriteReg(0x72, 0x38); //頻率偏差(1.2kbps)
- // 下面的設(shè)置根據(jù)Silabs 的Excel (9.6 kbps, deviation: 45 kHz, channel filter BW: 102.2 kHz
- SI4432_WriteReg(0x1C, 0x1b); //write 0x1E to the IF Filter Bandwidth register
- SI4432_WriteReg(0x20, 0x83); //write 0xD0 to the Clock Recovery Oversampling Ratio register
- SI4432_WriteReg(0x21, 0xc0); //write 0x00 to the Clock Recovery Offset 2 register
- SI4432_WriteReg(0x22, 0x13); //write 0x9D to the Clock Recovery Offset 1 register
- SI4432_WriteReg(0x23, 0xa9); //write 0x49 to the Clock Recovery Offset 0 register
- SI4432_WriteReg(0x24, 0x00); //write 0x00 to the Clock Recovery Timing Loop Gain 1 register
- SI4432_WriteReg(0x25, 0x03); //write 0x24 to the Clock Recovery Timing Loop Gain 0 register
- SI4432_WriteReg(0x1D, 0x40); //write 0x40 to the AFC Loop Gearshift Override register
- SI4432_WriteReg(0x1E, 0x0A); //write 0x0A to the AFC Timing Control register
- SI4432_WriteReg(0x2A, 0x14); //write 0x20 to the AFC Limiter register
- //前導(dǎo)碼 同步字
- SI4432_WriteReg(0x34, 0X0A); // 發(fā)射5字節(jié)的Preamble
- SI4432_WriteReg(0x35, 0x2A); // 需要檢測(cè) Preamble
- SI4432_WriteReg(0x33, 0x02);// 同步字3,2 是同步字
- SI4432_WriteReg(0x36, 0x2d); // 同步字為 0x2dd4
- SI4432_WriteReg(0x37, 0xd4);
- SI4432_WriteReg(0x30, 0x8D); // 使能PH+ FIFO模式,高位在前面,使能CRC校驗(yàn) CCITTT
- SI4432_WriteReg(0x32, 0x00 );// 禁止幀頭
- SI4432_WriteReg(0x71, 0x63); // 發(fā)射不需要 CLK,F(xiàn)iFo , FSK模式
- //GPIO
- SI4432_WriteReg(0x0b, 0x12); //
- SI4432_WriteReg(0x0c, 0x15); //
- //其他設(shè)置
- SI4432_WriteReg(0x09, 0xD7); // 負(fù)載電容
- SI4432_WriteReg(0x69, 0x60); //AGC過載
- //發(fā)射功率
- SI4432_WriteReg(0x6d, 0x1e);
- //手動(dòng)打開接收
- SI4432_WriteReg(0x07, 0x05);
- //打開 接收中斷
- SI4432_WriteReg(0x05, 0x03);
- SI4432_WriteReg(0x06, 0x00);
- //清中斷
- ItStatus1 = SI4432_ReadReg(0x03); //read the Interrupt Status1 register
- ItStatus2 = SI4432_ReadReg(0x04); //read the Interrupt Status2 register
- SI4432_WriteReg(0x07, 0x05);//打開接收
- SI4432_WriteReg(0x0d, 0xf4);//GPIO2接收數(shù)據(jù)
-
- while(1)
- {
- GPIO_SetBits(GPIOB , GPIO_Pin_10);//信號(hào)燈
- res = SI4432_ReadReg(0x02); delay_ms(20);printf("res =%02x \n",(unsigned short)res );
-
- SI4432_WriteReg(0x07, 0x01); // rf 模塊進(jìn)入Ready 模式
- delay_ms(20); // 延時(shí) 5ms, 讓系統(tǒng)穩(wěn)定
-
- SI4432_WriteReg(0x3e, 0x08); // 總共發(fā)射8個(gè)字節(jié)的數(shù)據(jù)
- SI4432_WriteReg(0x7F, 0x42);
- SI4432_WriteReg(0x7F, 0x42);
- SI4432_WriteReg(0x7F, 0x42);
- SI4432_WriteReg(0x7F, 0x42);
- SI4432_WriteReg(0x7F, 0x42);
- SI4432_WriteReg(0x7F, 0x42);
- SI4432_WriteReg(0x7F, 0x42);
- SI4432_WriteReg(0x7F, 0x42);
- SI4432_WriteReg(0x05, 0x04); // 整包數(shù)據(jù)發(fā)射完后,產(chǎn)生中斷
- SI4432_WriteReg(0x06, 0x00);
- ItStatus1 = SI4432_ReadReg(0x03);//清除中斷
- ItStatus2 = SI4432_ReadReg(0x04);
- SI4432_WriteReg(0x07, 0x09);//打開發(fā)射
- while ( SI4432_NIRQ == 1);
- GPIO_ResetBits(GPIOB , GPIO_Pin_10);
- //read interrupt status registers to release the interrupt flags
- ItStatus1 = SI4432_ReadReg(0x03); printf("ItStatus1 =%02x \n",(unsigned short)ItStatus1 );
- ItStatus2 = SI4432_ReadReg(0x04); printf("ItStatus2 =%02x \n",(unsigned short)ItStatus2 );
- delay_ms(1000);
- }
- }
- // 讀取寄存器
- u8 SI4432_ReadReg(u8 addr) //讀取寄存器的值
- {
- uint8_t temp=0;
-
- SI4432_NSEL=0;
- SPI1_ReadWriteByte(addr); //發(fā)送讀取寄存器地址
- temp=SPI1_ReadWriteByte(0Xff);
- SI4432_NSEL=1;
-
- return temp;
- }
- //寫寄存器
- void SI4432_WriteReg(u8 addr, u8 value) //寫寄存器
- {
- SI4432_NSEL=0;
- SPI1_ReadWriteByte(addr|0x80);
- SPI1_ReadWriteByte(value);
- SI4432_NSEL=1;
- }
-
復(fù)制代碼
|
-
-
SI4432 發(fā)送 接收程序.rar
2015-6-4 14:11 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
3.46 MB, 下載次數(shù): 399, 下載積分: 黑幣 -5
-
-
手冊(cè) 和編程指南.rar
2015-6-4 14:11 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
3.71 MB, 下載次數(shù): 252, 下載積分: 黑幣 -5
|