電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 1467|回復(fù): 0
收起左側(cè)

學(xué)習(xí)嵌入式開發(fā)就_英創(chuàng)信息技術(shù)嵌入式Linux工控板EM9160介紹

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級(jí)會(huì)員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-7-22 10:53:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
學(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ù)支持索取范例源碼。

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表