s5pv210——I2C的代码实践
以下內容源于朱有鵬嵌入式課程的學習,如有侵權,請告知刪除。
?
?
一、S5PV210的I2C控制器
1、為什么需要控制器?
- 通信雙方通過時序協調工作,但是時序比較復雜時,不利于SoC軟件完成;
- 于是SoC內部內置硬件的控制器來產生通信時序;
- 這樣我們寫軟件時只需要向控制器的寄存器中寫入配置值即可,控制器會產生適當的時序在通信線上和對方通信。
2、結構框圖
(1)時鐘部分
- 時鐘來源是PCLK_PSYS,經過內部分頻最終得到I2C控制器的CLK,通信中這個CLK會通過SCL線傳給從設備。
(2)I2C總線控制邏輯(主要體現在I2CCON、I2CSTAT這兩個寄存器)
- 主要負責產生I2C通信時序。
- 實際編程中要發送起始位、停止位、接收ACK等都是通過這兩個寄存器(背后所代表的電路模塊)實現的。
(3)移位寄存器(shift register)
- 將代碼中要發送的字節數據,通過移位寄存器變成連續的位,一個位一個位地丟給SDA線上去發送/接收。
(4)地址寄存器 + 比較器。
- 本I2C控制器做從設備的時候用。
3、I2C時鐘
(1)I2C時鐘源頭來源于PCLK(PCLK_PSYS,等于65MHz),經過了2級分頻后得到的。
(2)第一級分頻是I2CCON的bit6,可以得到一個中間時鐘I2CCLK(等于PCLK/16或者PCLK/512)。
(3)第二級分頻是得到最終I2C控制器工作的時鐘,以I2CCLK這個中間時鐘為來源,分頻系數為[1,16]。
(4)最終要得到時鐘是2級分頻后的時鐘,譬如一個可用的設置是:65000KHz/512/4=31KHz
4、主要寄存器
(1)I2CCON + I2CSTAT:主要用來產生通信時序和I2C接口配置。
(2)I2CADD:用來寫自己的slave address。
(3)I2CDS:發送/接收的數據都放在這里。
?
二、X210板載gsensor介紹
1、原理圖分析
(1)gsensor的供電由PWMTOUT3引腳控制。
- 當PWMTOUT3輸出低電平時gsensor無電不工作;當輸出高電平時gsensor才會工作。
(2)gsensor的SDA和SCL接的是S5PV210的I2C端口0。
(3)將來編程時在gsensor_init函數中要去初始化相關的GPIO。要把相應的GPIO設置為正確的模式和輸入輸出值。
2、重力加速度傳感器簡介
(1)用在手機、平板、智能手表等設備上,用來感受人的手的移動,獲取一些運動的方向性信息用來給系統作為輸入參量。
(2)可以用來設計智能手表的計步器功能。
(3)重力加速度傳感器、地磁傳感器、陀螺儀等三個傳感器結合起來,都是用來感測運動的速度、方位等信息的,所以現在最新的有9軸傳感器,就是把三者結合起來,并且用一定的算法進行綜合得出結論,目的是更加準確。
(4)一般傳感器的接口有2種:模擬接口和數字接口。
- 模擬接口是用接口電平變化來作為輸出的(譬如模擬接口的壓力傳感器,在壓力不同時輸出電平在0~3.3V范圍內變化,每一個電壓對應一個壓力。),SOC需要用AD接口來對接這種傳感器對它輸出的數據進行AD轉換,轉換得到數字電壓值,再用數字電壓值去校準得到壓力值。
- 數字接口是后來發展出來的,數字接口的sensor是在模擬接口的sensor基礎上,內部集成了AD,直接(通過一定的總線接口協議,一般是i2C)輸出一個數字值的參數,這樣SoC直接通過總線接口初始化、讀取傳感器輸出的參數即可(譬如gsensor、電容觸摸屏IC)。
3、I2C從設備的設備地址
(1)KXTE9(重力加速度傳感器?)的I2C地址固定為0b0001111(0x0f)。
(2)I2C從設備地址本身是7位的,但是在I2C通信中發送I2C從設備地址時實際發送的是8位。
- 高7位(bit7-bit1)對應I2C從設備的7位地址,最低一位(LSB)存放R/W信息(即下一個數據是主設備寫從設備讀(對應0),還是主設備讀從設備寫(對應1))。
(3)對于KXTE9來說,主設備(SoC)發給gsensor信息時,SAD應該是:0b00011110(0x1E);如果是主設備讀取gsensor信息時,SAD應該是:0b00011111(0x1F)。
4、I2C從設備的通信速率
(1)I2C協議本身屬于低速協議,通信速率不能太高。
(2)主設備和從設備本身都有最高的通信速率限制(屬于各個芯片本身的參數),實際編程時只要小于兩個即可。
(3)一般來說只能做從設備的sensor芯片本身i2c通信速率偏低,像KXTE9最高支持400KHz的頻率。
三、I2C總線通信流程
1、S5PV210的主發送流程圖
?
2、S5PV210的主接收流程圖
?
3、gsensor的寫寄存器流程圖
?
4、gsensor的讀寄存器流程圖
?
四、I2C通信代碼
1、I2C控制器初始化:s3c24xx_i2c_init
(1)初始化做的事情:初始化GPIO,設置IRQEN和ACKEN,初始化I2C時鐘
2、I2C控制器主模式開始一次讀寫:s3c24xx_i2c_message_start
?
3、I2C控制器主模式結束一次讀寫:s3c24xx_i2c_stop
?
4、框架分析
(1)分析內容
- 我們最終目的是通過讀寫gsensor芯片的內部寄存器來得到一些信息。
- 為了完成這個目的,我們需要能夠讀寫gsensor的寄存器,根據gsensor的規定我們需要按照一定的操作流程來讀寫gsensor的內部寄存器,這是一個層次(姑且叫做傳輸層、協議層、應用層)。
- 我們要按照操作流程去讀寫寄存器,就需要考慮I2C接口協議(這就是所謂的物理層,本質就是那些時序)。
- 此時主機SoC有或者沒有控制器,有控制器時考慮控制器的寄存器,沒控制器時要自己軟件模擬時序。
- 協議層的代碼主要取決于gsensor芯片;物理層代碼主要取決于主機SoC。
(2)操作函數
gsensor寫寄存器:gsensor_i2c_write_reg
gsensor讀寄存器:gsensor_i2c_read_reg
gsensor編程:gsensor_initial等
?
總結
以上是生活随笔為你收集整理的s5pv210——I2C的代码实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年最佳的9种逆向工程工具[持续更
- 下一篇: Apizza在线接口工具如何支持REST