久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3669|回復: 0
打印 上一主題 下一主題
收起左側

關于nRF24L01讀內部任何寄存器值為08H的經歷和解決辦法

[復制鏈接]
跳轉到指定樓層
樓主
ID:362076 發表于 2019-2-9 20:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
某次設計需要使用nRF24L01實現數據的雙向通信,將原本在51單片機上運行成功的程序移植到STM8單片機上時,出現無法運行的問題。嘗試讀取nRF24L01內部的寄存器以查看模塊工作狀態時,發現無論哪個寄存器讀出值均為0x08。現具體描述此次經歷以及最后的解決方法。
原設計平臺為IAP15W4K58S4,開發環境Keil uVision4,設定的工作頻率22.1184MHz;移植的目標平臺為STM8S105K4T6,開發環境IAR for STM8,使用HSE:8MHz,CPU時鐘不分頻。
設計同時使用波特率為115200bps的串口通信以及外部中斷。
由于設計需要,在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
復制代碼

遵循調試的基本步驟,我更換了無線模塊、連接線,以及平臺核心板,但是都不能夠解決問題。
考慮到STM8S的IIC接口,是真正的開漏輸出,沒有內部上拉電阻。于是查詢芯片手冊:



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


可以看到,O1為不可配置的2MHz慢速引腳,因為我所配置的單片機工作頻率達到8MHz,懷疑是在與nRF24L01通訊過程中引腳電平變化速度過快導致IO電平不穩定,于是配置CPUDIV,使CPU工作頻率8分頻在1MHz,故障依舊。
所以引腳輸出速度不是引起問題的原因。
重新查閱nRF24L01的芯片手冊,想到芯片的各個寄存器讀出值均為08H,那么應該排除芯片的初始化失敗這樣的可能性,因為無論是否初始化,按照正確配置步驟進行過之后,芯片內部的寄存器保留位應該是保持保留值不變化,而現在的現象是,以CD載波檢測寄存器為例,本應該只有00H和01H兩種取值可能性,卻讀出08H。
將關注點放在與模塊進行通信的底層SPI模擬函數上,我在51平臺上使用的SPI讀寫函數如下所示:

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

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


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


故此得到結論,IAR下,對于一個位只能賦值邏輯0、1,如果賦值一個非布爾型的數據,則會產生混亂。


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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 永久www成人看片 | 懂色中文一区二区在线播放 | 久久成人免费 | 999精品视频 | 精品美女久久久久久免费 | 日本一区二区三区精品视频 | 中文字幕日韩一区 | 久久福利网站 | 91精品国产91久久久久久丝袜 | 色婷婷一区 | 国产精品久久久久久久久久东京 | 日本不卡一区 | 91社区视频| 久久久久久国产精品 | 亚洲人一区 | 亚洲精品一区二区三区蜜桃久 | 国产高清在线精品一区二区三区 | 美女日皮网站 | 久久av一区二区三区 | 在线观看国产精品一区二区 | 在线观看亚洲精品 | 欧美专区在线 | 我想看国产一级毛片 | 亚洲一级淫片 | 亚洲成人二区 | 国产精品日韩高清伦字幕搜索 | 日本精品视频一区二区 | 国产区高清| 国产a区 | 国产高清一区二区三区 | 欧美vide| 人妖一区 | 日韩一区二区三区四区五区六区 | 国产精品国产 | 久久精品亚洲欧美日韩精品中文字幕 | 日本精品久久久久 | 91九色在线观看 | 成人做爰www免费看视频网站 | 成人免费大片黄在线播放 | 欧美video | 欧美第一区 |