|
學(xué)習(xí)嵌入式開發(fā)就_英創(chuàng)信息技術(shù)嵌入式Linux工控板EM9160介紹,
I2C總線是一種2線制的主從通訊協(xié)議,主要運(yùn)用于器件之間的數(shù)據(jù)通訊,在嵌入式系統(tǒng)中得到非常廣泛的應(yīng)用。作為一款高性價(jià)比的嵌入式Linux工控板,EM9160的對(duì)I2C總線提供了良好的支持,其主要特點(diǎn)是EM9160的16位GPIO中的任意位都可作為I2C總線的時(shí)鐘信號(hào)SCL或數(shù)據(jù)地址信號(hào)SDA,這樣客戶可根據(jù)自己整機(jī)的具體情況,靈活的配置EM9160的GPIO管腳來作為I2C總線信號(hào)。
在Linux環(huán)境,I2C的驅(qū)動(dòng)程序已自動(dòng)加載,其設(shè)備文件名為“/dev/em9x60_i2c”。應(yīng)用程序通過3個(gè)IOCTL命令來操作I2C接口:首先需要配置I2C總線資源,包括SCL、SDA信號(hào)和通訊速度,然后才能根據(jù)具體芯片的特性對(duì)其內(nèi)部寄存器進(jìn)行讀寫操作。以下以電力智能終端中廣泛使用的RTC芯片RX-8025為例,對(duì)I2C的操作流程作進(jìn)一步的介紹。
硬件電路:RX-8025是一種帶I2C總線接口的實(shí)時(shí)時(shí)鐘(RTC)芯片,具有精確調(diào)整的晶體頻率,可滿足電力智能終端需求。在下圖中,EM9160的GPIO6作為I2C總線的SCL信號(hào)、GPIO7作為SDA信號(hào),注意10K上拉是必須的。
I2C總線配置:PWM調(diào)用函數(shù)fd=open(”/dev/em9x60_i2c”, O_RDWR)打開設(shè)備文件后,首先需要配置總線,具體操作是把參數(shù)設(shè)置到指定的數(shù)據(jù)結(jié)構(gòu)中,再調(diào)用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,可用于大多數(shù)RTC、AD芯片;=1:高速時(shí)指波特率接近400kbps;=2:全速的波特率可高達(dá)1Mbps,主要用于存儲(chǔ)器類型的芯片。設(shè)置操作如下:
rc = ioctl(fd, EM9X60_I2C_IOCTL_CONFIG, &config);
I2C數(shù)據(jù)寫:EM9160的I2C總線寫操作,由數(shù)據(jù)結(jié)構(gòu)struct i2c_io來傳遞參數(shù)和數(shù)據(jù),具體定義可查看em9x60_drivers.h。寫操作支持一次最多可寫入16個(gè)字節(jié),但具體寫入多少還受I2C器件本身的限制,如RX-8025只支持一次對(duì)一個(gè)寄存器寫入,例如寫入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個(gè)字節(jié)
io_info.data_buf[0] = 0x30; //注意是BCD碼
rc = ioctl(fd, EM9X60_I2C_IOCTL_WRITE, &in_info); //執(zhí)行寫操作
I2C數(shù)據(jù)讀:EM9160的I2C總線讀操作,由數(shù)據(jù)結(jié)構(gòu)struct i2c_io來傳遞參數(shù)和數(shù)據(jù),具體定義可查看em9x60_drivers.h。讀操作支持一次最多可寫入16個(gè)字節(jié),但具體一次讀出多少字節(jié)還受I2C器件本身的限制,RX-8025支持一次讀出多個(gè)寄存器的數(shù)據(jù),例如一次讀取全部日期時(shí)間信息共7個(gè)字節(jié),具體代碼操作如下:
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個(gè)字節(jié)
rc = ioctl(fd, EM9X60_I2C_IOCTL_READ, &in_info); //執(zhí)行讀操作
I2C數(shù)據(jù)讀寫所用的數(shù)據(jù)結(jié)構(gòu)中,reg_addr表示被讀寫器件的寄存器地址,若為單字節(jié)地址,該變量的最高位(MSB = D31)應(yīng)為0;若為雙字節(jié)地址,地址占用reg_addr的D15 - D0(最低位,LSB),而變量的最高位D31必須置為1。另外,對(duì)不需要寄存器的器件,可把reg_addr設(shè)置為0xFFFFFFFF,這時(shí)驅(qū)動(dòng)程序?qū)⒉辉侔l(fā)送寄存器地址。上述代碼中從RX-8025讀出的數(shù)據(jù)均為BCD,通常需要轉(zhuǎn)換成C語言的整型數(shù)據(jù)類型。
為了方便客戶使用RX-8025,我們編寫了通過EM9160的I2C驅(qū)動(dòng)程序操作RTC的范例程序,包括啟動(dòng)RTC,設(shè)置時(shí)間,讀取時(shí)間等功能。感興趣的客戶可向英利公司技術(shù)支持索取范例源碼。 |
|