找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3763|回復(fù): 0
收起左側(cè)

關(guān)于nRF24L01讀內(nèi)部任何寄存器值為08H的經(jīng)歷和解決辦法

[復(fù)制鏈接]
ID:362076 發(fā)表于 2019-2-9 20:01 | 顯示全部樓層 |閱讀模式
某次設(shè)計(jì)需要使用nRF24L01實(shí)現(xiàn)數(shù)據(jù)的雙向通信,將原本在51單片機(jī)上運(yùn)行成功的程序移植到STM8單片機(jī)上時(shí),出現(xiàn)無(wú)法運(yùn)行的問(wèn)題。嘗試讀取nRF24L01內(nèi)部的寄存器以查看模塊工作狀態(tài)時(shí),發(fā)現(xiàn)無(wú)論哪個(gè)寄存器讀出值均為0x08�,F(xiàn)具體描述此次經(jīng)歷以及最后的解決方法。
原設(shè)計(jì)平臺(tái)為IAP15W4K58S4,開(kāi)發(fā)環(huán)境Keil uVision4,設(shè)定的工作頻率22.1184MHz;移植的目標(biāo)平臺(tái)為STM8S105K4T6,開(kāi)發(fā)環(huán)境IAR for STM8,使用HSE:8MHz,CPU時(shí)鐘不分頻。
設(shè)計(jì)同時(shí)使用波特率為115200bps的串口通信以及外部中斷。
由于設(shè)計(jì)需要,在STM8S上,nRF24L01模塊以軟件模擬SPI的方式連接在STM8S的PB0~PB5端口上。引腳的定義如下:
  1. #define nRF24L01_MISO PB_IDR_IDR5
  2. #define nRF24L01_MOSI PB_ODR_ODR4
  3. #define nRF24L01_SCK PB_ODR_ODR3
  4. #define nRF24L01_CSN PB_ODR_ODR2
  5. #define nRF24L01_CE PB_ODR_ODR1
  6. #define nRF24L01_IRQ PB_IDR_IDR0
復(fù)制代碼

遵循調(diào)試的基本步驟,我更換了無(wú)線模塊、連接線,以及平臺(tái)核心板,但是都不能夠解決問(wèn)題。
考慮到STM8S的IIC接口,是真正的開(kāi)漏輸出,沒(méi)有內(nèi)部上拉電阻。于是查詢芯片手冊(cè):



從手冊(cè)可以看到,STM8S105K4T6的PE1、PE2是真正的開(kāi)漏輸出,而我所使用的LQFP32封裝上沒(méi)有這兩個(gè)引腳,PB4、PB5為IIC的映射管腳,是具有上拉電阻的。
所以問(wèn)題不在管腳選擇上。
重新查閱芯片手冊(cè),注意到PB管腳的輸出速度均為O1級(jí)別,手冊(cè)上對(duì)于O1是這樣描述的:


可以看到,O1為不可配置的2MHz慢速引腳,因?yàn)槲宜渲玫膯纹瑱C(jī)工作頻率達(dá)到8MHz,懷疑是在與nRF24L01通訊過(guò)程中引腳電平變化速度過(guò)快導(dǎo)致IO電平不穩(wěn)定,于是配置CPUDIV,使CPU工作頻率8分頻在1MHz,故障依舊。
所以引腳輸出速度不是引起問(wèn)題的原因。
重新查閱nRF24L01的芯片手冊(cè),想到芯片的各個(gè)寄存器讀出值均為08H,那么應(yīng)該排除芯片的初始化失敗這樣的可能性,因?yàn)闊o(wú)論是否初始化,按照正確配置步驟進(jìn)行過(guò)之后,芯片內(nèi)部的寄存器保留位應(yīng)該是保持保留值不變化,而現(xiàn)在的現(xiàn)象是,以CD載波檢測(cè)寄存器為例,本應(yīng)該只有00H和01H兩種取值可能性,卻讀出08H。
將關(guān)注點(diǎn)放在與模塊進(jìn)行通信的底層SPI模擬函數(shù)上,我在51平臺(tái)上使用的SPI讀寫(xiě)函數(shù)如下所示:

  1. unsigned char nRF24L01_SPI_RW(unsigned char dat)//向SPI發(fā)送一個(gè)字節(jié)的數(shù)據(jù),并且由其移位寄存器的特性,返回收到的字節(jié)
  2. {
  3.     unsigned char i;
  4.     for(i=0;i<8;i++)//輸出8個(gè)比特
  5.     {
  6.         nRF24L01_MOSI=(dat&0x80);//高位先出,按位傳遞
  7.         dat=(dat<<1);//轉(zhuǎn)移比特位
  8.         nRF24L01_SCK=1;//置高時(shí)鐘
  9.         nRF24L01_MISO=1;
  10.         dat|=nRF24L01_MISO;//得到從機(jī)傳來(lái)的比特位
  11.         nRF24L01_SCK=0; //拉低時(shí)鐘
  12.     }
  13.     return(dat);//返回移位得到的數(shù)據(jù)
  14. }
復(fù)制代碼

按照SPI的協(xié)議,重寫(xiě)函數(shù)如下:
  1. unsigned char nRF24L01_SPI_RW(unsigned char dat)//向SPI發(fā)送一個(gè)字節(jié)的數(shù)據(jù),并且由其移位寄存器的特性,返回收到的字節(jié)
  2. {
  3.     unsigned char i;
  4.     for(i=0;i<8;i++)//輸出8個(gè)比特
  5.     {
  6.         if(dat&0x80)
  7.         {
  8.             nRF24L01_MOSI=1;
  9.         }
  10.         else
  11.         {
  12.             nRF24L01_MOSI=0;
  13.         }
  14.         dat=(dat<<1);//轉(zhuǎn)移比特位
  15.         nRF24L01_SCK=1;//置高時(shí)鐘
  16.         if(nRF24L01_MISO)
  17.         {
  18.             dat|=1;
  19.         }
  20.         else
  21.         {
  22.             dat|=0;
  23.         }
  24.         nRF24L01_SCK=0; //拉低時(shí)鐘
  25.     }
  26.     return(dat);//返回移位得到的數(shù)據(jù)
  27. }
復(fù)制代碼


則出乎意料的恢復(fù)正常了。
后經(jīng)過(guò)逐步化簡(jiǎn)調(diào)試,這樣的表達(dá)在IAR環(huán)境下也可以正常運(yùn)行:
  1. unsigned char nRF24L01_SPI_RW(unsigned char dat)//向SPI發(fā)送一個(gè)字節(jié)的數(shù)據(jù),并且由其移位寄存器的特性,返回收到的字節(jié)
  2. {
  3.     unsigned char i;
  4.     for(i=0;i<8;i++)//輸出8個(gè)比特
  5.     {
  6.         nRF24L01_MOSI=(_Bool)(dat&0x80);//高位先出,按位傳遞,強(qiáng)制轉(zhuǎn)換為布爾類型
  7.         dat=(dat<<1);//轉(zhuǎn)移比特位
  8.         nRF24L01_SCK=1;//置高時(shí)鐘
  9.         dat|=nRF24L01_MISO//得到從機(jī)傳來(lái)的比特位
  10.         nRF24L01_SCK=0; //拉低時(shí)鐘
  11.     }
  12.     return(dat);//返回移位得到的數(shù)據(jù)
  13. }
復(fù)制代碼


故此得到結(jié)論,IAR下,對(duì)于一個(gè)位只能賦值邏輯0、1,如果賦值一個(gè)非布爾型的數(shù)據(jù),則會(huì)產(chǎn)生混亂。


文章首發(fā)51CTO博客,http://blog.51cto.com/14195504/2348865
此處為原作者轉(zhuǎn)載,如需再次轉(zhuǎn)載,煩請(qǐng)注明出處,不勝感謝。


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表