I2C總線是一種2線制的主從通訊協議,主要運用于器件之間的數據通訊,在嵌入式系統中得到非常廣泛的應用。作為一款高性價比的嵌入式Linux工控板,EM9160的對I2C總線提供了良好的支持,其主要特點是EM9160的16位GPIO中的任意位都可作為I2C總線的時鐘信號SCL或數據地址信號SDA,這樣客戶可根據自己整機的具體情況,靈活的配置EM9160的GPIO管腳來作為I2C總線信號。
在Linux環境,I2C的驅動程序已自動加載,其設備文件名為“/dev/em9x60_i2c”。應用程序通過3個IOCTL命令來操作I2C接口:首先需要配置I2C總線資源,包括SCL、SDA信號和通訊速度,然后才能根據具體芯片的特性對其內部寄存器進行讀寫操作。以下以電力智能終端中廣泛使用的RTC芯片RX-8025為例,對I2C的操作流程作進一步的介紹。
硬件電路:RX-8025是一種帶I2C總線接口的實時時鐘(RTC)芯片,具有精確調整的晶體頻率,可滿足電力智能終端需求。在下圖中,EM9160的GPIO6作為I2C總線的SCL信號、GPIO7作為SDA信號,注意10K上拉是必須的。
I2C總線配置:PWM調用函數fd=open(”/dev/em9x60_i2c”, O_RDWR)打開設備文件后,首先需要配置總線,具體操作是把參數設置到指定的數據結構中,再調用IOCTL命令如下:
struct i2c_config config; //定義在em9x60_drivers.h
config.scl_gpio_num = GPIO6; //GPIO6作為SCL,定義見em9x60_drivers.h
config.sda_gpio_num = GPIO7; //GPIO7作為SCL
config.speed = 0; //=0:正常速度;=1:高速;=2:全速
I2C總線的速度指波特率,=0是最通常的速度,大約200kbps,可用于大多數RTC、AD芯片;=1:高速時指波特率接近400kbps;=2:全速的波特率可高達1Mbps,主要用于存儲器類型的芯片。設置操作如下:
rc = ioctl(fd, EM9X60_I2C_IOCTL_CONFIG, &config);
I2C數據寫:EM9160的I2C總線寫操作,由數據結構struct i2c_io來傳遞參數和數據,具體定義可查看em9x60_drivers.h。寫操作支持一次最多可寫入16個字節,但具體寫入多少還受I2C器件本身的限制,如RX-8025只支持一次對一個寄存器寫入,例如寫入30秒到RTC的秒寄存器的具體代碼操作如下:
struct i2c_io io_info;
io_info.dev_addr = RX8025_ADDR; //RX8025_ADDR定義在RX-8025.h
io_info.reg_addr = SEC_REG; //SEC_REG定義在RX-8025.h
io_info.data_len = 1; //1個字節
io_info.data_buf[0] = 0x30; //注意是BCD碼
rc = ioctl(fd, EM9X60_I2C_IOCTL_WRITE, &in_info); //執行寫操作
I2C數據讀:EM9160的I2C總線讀操作,由數據結構struct i2c_io來傳遞參數和數據,具體定義可查看em9x60_drivers.h。讀操作支持一次最多可寫入16個字節,但具體一次讀出多少字節還受I2C器件本身的限制,RX-8025支持一次讀出多個寄存器的數據,例如一次讀取全部日期時間信息共7個字節,具體代碼操作如下:
struct i2c_io io_info;
io_info.dev_addr = RX8025_ADDR; //RX8025_ADDR定義在RX-8025.h
io_info.reg_addr = SEC_REG; //SEC_REG定義在RX-8025.h
io_info.data_len = 7; //7個字節
rc = ioctl(fd, EM9X60_I2C_IOCTL_READ, &in_info); //執行讀操作
I2C數據讀寫所用的數據結構中,reg_addr表示被讀寫器件的寄存器地址,若為單字節地址,該變量的最高位(MSB = D31)應為0;若為雙字節地址,地址占用reg_addr的D15 - D0(最低位,LSB),而變量的最高位D31必須置為1。另外,對不需要寄存器的器件,可把reg_addr設置為0xFFFFFFFF,這時驅動程序將不再發送寄存器地址。上述代碼中從RX-8025讀出的數據均為BCD,通常需要轉換成C語言的整型數據類型。
為了方便客戶使用RX-8025,我們編寫了通過EM9160的I2C驅動程序操作RTC的范例程序,包括啟動RTC,設置時間,讀取時間等功能。感興趣的客戶可向英利公司技術支持索取范例源碼。
-
嵌入式系統
+關注
關注
41文章
3566瀏覽量
129227 -
Linux
+關注
關注
87文章
11227瀏覽量
208924
發布評論請先 登錄
相關推薦
評論