1. I2C介紹
IIC又簡寫成I2C,是一種串行通信總線,使用多主從架構。
最初設計目的為了讓主板、嵌入式系統或手機用來連接低速周邊設備。多用于小數據量的場合,有傳輸距離短,任意時刻只能有一個主機等特性。
在Linux嵌入式應用開發的情景下,完全可以不必理會IIC協議的詳細規定。只需要按照驅動層提供給我們的操作IIC外設的操作接口函數就可以像操作linux中其他普通設備文件那樣輕松的操作IIC外設了。
1.1 開發板上I2C資源介紹
EASY EAI Nano-TB開發板預留引出了1路IIC資源:IIC_5,以供用戶自定義調用。確切的分部位置,如下圖所示:

1.2 硬件接線示意圖

本示例采用ADS1115電壓檢測模塊進行輔助演示。此模塊功能是把檢測到的電壓(模擬信號)轉化為數字信號存入寄存器中,然后以IIC的通信方式對外提供電壓信息的提取。
ADS1115模塊與EASY EAI Nano-TB的接線原理圖如下所示:

2. 快速上手
2.1 開發環境準備
如果您初次閱讀此文檔,請閱讀《入門指南/開發環境準備/Easy-Eai編譯環境準備與更新》,并按照其相關的操作,進行編譯環境的部署。
在PC端Ubuntu系統中執行run腳本,進入EASY-EAI編譯環境,具體如下所示。
cd ~/develop_environment ./run.sh

2.2 源碼下載以及例程編譯
首先,在虛擬機后臺終端,執行以下命令,創建外設單例源碼管理目錄:
cd /opt mkdir -p EASY-EAI-Nano-TB/demo
首先,到【百度網盤】上下載相關的單例程序:
鏈接:https://pan.baidu.com/s/1Br608Hiff2Xs65PzWO_qWQ?pwd=1234
提取碼:1234
比如把單例程序下載到:此電腦\D:\BaiduNetdisk (無規定,用戶可自主選擇),如下圖所示。




最后,進入到對應的例程目錄執行編譯操作,具體命令如下所示:
cd EASY-EAI-Nano-TB/demo/08_IIC ./build.sh
注:
* 由于依賴庫部署在板卡上,因此交叉編譯過程中必須保持/mnt掛載。

編譯成功后,會生成一個test-ads1115的可執行程序,并會自動部署到開發板的/userdata/目錄中。
2.3 例程運行
通過串口調試或ssh調試,進入板卡后臺,定位到例程部署的位置,如下所示:
cd /userdata

執行例程命令,如下所示:
sudo ./test-ads1115
執行效果如下所示,利用探測分別觸碰3V3,1V8,GND三個端子,則可在終端測出對應的電壓值。

3. C語言使用案例
ADS1115的C語言使用案例,代碼地址為08_IIC/test-ads1115/main.c,供用戶編碼參考。以下代碼展示了對ADS1115操作流程:
int32_t ads1115_config_register(uint32_t fd, uint8_t configH, uint8_t configL) { uint8_t reg_data[3] = {ADS1015_REG_POINTER_CONFIG, configH, configL}; return iic_write(fd, ADS1115_ADDRESS, reg_data, sizeof(reg_data)); } int16_t ads1115_read_data(uint32_t fd) { bool ret = false; /*讀取數據*/ uint8_t tx_data[1] = {ADS1015_REG_POINTER_CONVERT}; if(iic_write(fd, ADS1115_ADDRESS, tx_data, sizeof(tx_data)) < sizeof(tx_data)){ printf("iic write faild !\n"); return -1; } uint8_t rx_data[3]={0}; if(iic_read(fd, ADS1115_ADDRESS, rx_data, 2) < 0){ printf("iic read faild !\n"); return -1; } int16_t data = rx_data[0]*256+rx_data[1]; return data; } double ads1115_get_voltage_val(uint32_t fd, uint8_t configH, uint8_t configL) { /*配置寄存器*/ if(ads1115_config_register(fd, configH, configL) < 0){ printf("ads1115 config register faild\n"); return 0.0; } usleep(100 * 1000); int16_t ad_val = ads1115_read_data(fd); if((0x7FFF == ad_val)|(0X8000 == ad_val)) {//是否超量程了 ad_val = 0; printf("ads1115 over PGA\r\n"); } double val = 0.0; switch((0x0E&configH)>>1)//量程對應的分辨率 { case(0x00): val = (double)ad_val*187.5/1000000.0; break; case(0x01): val = (double)ad_val*125/1000000.0; break; case(0x02): val = (double)ad_val*62.5/1000000.0; break; case(0x03): val = (double)ad_val*31.25/1000000.0; break; case(0x04): val = (double)ad_val*15.625/1000000.0; break; case(0x05): val = (double)ad_val*7.8125/1000000.0; break; default: val = 0.0; break; } return val; } int main(int argc, char const *argv[]) { bool ret = false; double val; int fd = iic_init("/dev/i2c-2"); if(fd < 0){ printf("iic init faild \n"); return -1; } if(0 != iic_set_addr_len(fd, 7)){ return -1; } if(0 != iic_set_addr(fd, ADS1115_ADDRESS)){ return -1; } while (1) { val = ads1115_get_voltage_val(fd, CONFIG_REG_H, CONFIG_REG_L); printf("val: %f V\r\n",val); sleep(2); } iic_release(fd); return 0; }
其中iic_init(),iic_set_addr_len(),iic_set_addr(),iic_read(),iic_write(),iic_release()是對系統調用的易用化封裝。具體實現于08_IIC/commonApi/iic.c
除了需要有對IIC硬件資源進行操作的接口以外,要需要清楚IIC總線上的IIC從機設備的寄存器操作方法。如ADS1115電壓檢測芯片,與其寄存器相關的操作定義均在08_IIC/test-ads1115/ads1115.h中實現。
-
Linux
+關注
關注
88文章
11790瀏覽量
219383 -
瑞芯微
+關注
關注
27文章
815瀏覽量
54591 -
EASY-EAI靈眸科技
+關注
關注
4文章
77瀏覽量
3706 -
RV1126B
+關注
關注
0文章
66瀏覽量
219
發布評論請先 登錄
瑞芯微(EASY EAI)RV1126B 音頻輸入
瑞芯微(EASY EAI)RV1126B PWM使用
瑞芯微(EASY EAI)RV1126B 音頻輸出
【EASY EAI Nano-TB(RV1126B)開發板試用】+初識篇
【EASY EAI Nano-TB(RV1126B)開發板試用】命令行功能測試-shell腳本進行IO控制-燈閃
【EASY EAI Nano-TB(RV1126B)開發板試用】命令行功能測試-shell腳本進行IO控制-紅綠燈項目
【EASY EAI Nano-TB(RV1126B)開發板試用】命令行功能測試-shell腳本進行IO控制-紅綠燈按鈕項目
請問各位大佬,如何解決,瑞芯微 RV1126B 使用 mpp 自帶工具 調試時,內核直接報錯崩潰!
【EASY EAI Nano-TB(RV1126B)開發板試用】+1、開箱上電
【EASY EAI Nano-TB(RV1126B)開發板試用】介紹、系統安裝
RV1126系列選型指南:從RV1126到RV1126B,一文看懂升級差異
【免費試用】EASY EAI Nano-TB(RV1126B)開發套件評測
替代升級實錘!實測RV1126B,CPU性能吊打RV1126
瑞芯微(EASY EAI)RV1126B 人體關鍵點識別
瑞芯微(EASY EAI)RV1126B I2C使用
評論