日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

nRF52832之硬件I2C

發布時間:2023/12/15 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 nRF52832之硬件I2C 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這幾天一直在折騰nRF52832的硬件I2C,到了今天最終出現了成果,在此也印證了那句話:“耕耘就有收獲”

52832的硬件I2C盡管官方提供了demo,可是自己對I2C通信理解的不夠深入,再一個52832的代碼也封裝的太深了。可是對接口函數沒有一個明白的解釋(也能夠說是我英文太渣,別人寫了可是我沒看懂。

。),這樣對于首次接觸nRF產品的人就造成了一定的難度

依據我的開發過程,還是先說明一下I2C的一些相關知識,由于我是先調硬件I2C搞了半天不正確頭,然后再開發模擬I2C,模擬的成功了再來調試的硬件TWI(也就是52832的硬件I2C,全稱預計是two wire interface)

I2C通信須要兩條線:SDA,SCL。

I2C通信設備有兩種角色:master和slave。一般用戶開發程序都是開發master端,然后去讀寫作為slave的外設,比方:eeprom,flash,sensor,display device。

在通信過程中,有兩組特殊控制信號:
start :scl為高電平時,sda由高電平變為低電平。

stop: scl為高電平時,sda由低電平變為高電平。

(注意在通信過程中。SCL始終由master控制。這句話在做模擬I2C的時候就顯得意義非凡了)

master做寫數據操作時。先是SCL和SDA都處于空暇狀態(兩者都是高電平),然后SDA由高變低(start信號);變低后SCL拉低,這個時候SDA就能夠變成想要的電平。高電平代表bit為1,低電平代表bit為0。電平穩定后拉高時鐘(拉高的目的是為了讓slave讀取數據,SCL為高時,SDA要保持不變。slave讀取SDA的電平)。傳輸數據完了后要結束:先拉高SCL。然后拉高SDA。然后拉低SDA,一個完整的stop信號完畢了。

讀數據操作時,start和stop這些時序一樣,可是主機要去解析slave傳來的數據(電平信號), 拉低SCL,然后釋放SDA(即拉高SDA),一段延時之后拉高SCL再去讀取SDA電平信號(既然是讀取電平。這里必要設置為輸入引腳啦),假設是高電平則記下是一個H_bit,否則是L_bit,讀取到8位數據后假設還要繼續讀取則回復ACK,否則回復NCK。

ACK信號是SCL拉低后給SDA一個低電平,然后拉高SCL;
ANK信號是SCL拉低和給SDA一個高電平。然后拉高SCL。

以下以解說下master 和 slave傳輸時整體操作:
master向slave寫數據,一般slave端寫數據都要一個確定的寄存器地址。即你要往這個外設的哪個位置傳數據
以eeprom為例,先發送器件地址0xAE(8位數據。高7位是地址。LSB是傳輸數據方向:0;0代表寫。1代表讀,能夠當做out。in來理解這樣easy記住)。
然后發送寄存器地址,然后發送數據。
時序上面能夠是
start–slave_address_write–register_address–N*Send_data–stop
Send_data每發一個字節,slave會回應一個“CK信號”。假設是ACK則發送數據成功了。否則失敗
由于是連續的寫數據,因此中間能夠沒有stop,start

讀數據操作。要先寫進一個寄存器地址,再傳遞一個讀命令
start–slave_address_write–register_address–start–slave_address_Read–N*Receive_data–stop

發送slave_address_Read前要先re_start,跟start信號一樣
Receive_data 是接收數據,這時要去識別SDA電平而且解析數據,作出ACK回應。最后一個字節接收完畢回復NCK信號;然后stop。

以下說明nRF52832的硬件I2C代碼問題

nRF留出的API接口是

ret_code_t app_twi_perform(app_twi_t *                p_app_twi,app_twi_transfer_t const * p_transfers,
uint8_t         number_of_transfers,
void (* user_function)(void)
)

這個函數調用了app_twi_schedule函數,以此來導入到隊列

ret_code_t app_twi_schedule(app_twi_t *                   p_app_twi,
                            app_twi_transaction_t const * p_transaction)

想要調用app_twi_perform函數那么得準備好參數
1、p_app_twi。這是在TWI傳輸隊列里申請一個位置
英文原話是creating an instance of the TWI transaction manager.
2、p_transfers,這是包括了要傳輸的數組塊的一個數組
3、number_of_transfers,這個是你傳輸數據塊的個數
4、user_function,一個用戶的回調函數的函數指針,數據塊傳輸完了API內部會調用這個user_function

解釋:上面說的數據塊的意思就是一個完整的I2C操作須要用到的信息:包括了slave地址。數據傳遞方向(讀或者寫),傳輸的數據data_buffer,數據長度length,有無結束標志(意思就是這團傳輸數據完了后是否結束通信了)

在官方SDK里面文件夾
examplesperipheral wi_master_using_app_twi里打開project

首先初始化TWI

傳輸數據

傳輸的內容

注意AT24C02_init_transfers是一個全局變量數組
也就是它的地址是在堆里面的,不會自己主動釋放。這么做的原因是這個數組的地址可能會被多次調用,而放在某個函數里面會造成地址不同造成錯誤
demo里面有解釋

  // [these structures have to be "static" - they cannot be placed on stack
    //  since the transaction is scheduled and these structures most likely
    //  will be referred after this function returns]
      static app_twi_transfer_t const transfers[] =
    {
         AT24C02_READ(&AT24C02_first_page_addr,AT_buffer,5)

    };

注意這里的AT_WRITE_NUMBER數組能夠理解為一個數據緩沖區,能夠通過改變這個數組的內容然后調用app_twi_perform來發數據出去(把const去掉)

讀數據相似,demo用的自己定義傳輸函數
仿寫一個

沒想到這篇博客會有這么多人看。寫的挺亂的。可是也不想再做改動了~~~寫博客真的耗費時間啊~

建議大家去看twi_sensor這個project
路徑:NORDIC官方SDK
RF52_SDK_11.0.0examplesperipheral wi_sensor

總結

以上是生活随笔為你收集整理的nRF52832之硬件I2C的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。