開發與維運

HaaS EDU K1設備資源 之 IIC

1、概述

IIC(Inter-Integrated Circuit)總線是一種由PHILIPS公司開發的兩線式串行總線,用於連接微控制器及其外圍設備。它是由數據線SDA和時鐘SCL構成的串行總線,可發送和接收數據。在CPU與被控IC之間、IC與IC之間進行雙向傳送,高速IIC總線一般可達400kbps以上。

I2C總線在傳送數據過程中共有三種類型信號, 它們分別是:開始信號、結束信號和應答信號。

開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。

結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據。

應答信號:接收數據的IC在接收到8bit數據後,向發送數據的IC發出特定的低電平脈衝,表示已收到數據。CPU向受控單元發出一個信號後,等待受控單元發出一個應答信號,CPU接收到應答信號後,根據實際情況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷為受控單元出現故障。IIC總線如圖所示:

image.png

IIC總線時序圖

2、資源介紹

HaaS1000中自帶了兩路I2C,主模式最高1.4Mbps接口。兩路I2C管腳也是複用的,都是通過IO的fuction選擇出來的。當前的HaaS EDU K1的默認配置為:
image.png

HaaS EDU K1中只用到的了I2C1, 即(GPIO_P0_2,GPIO_P0_3),HaaS EDU K1上所有的傳感器都是接在I2C1,每個傳感器的地址是不同的。

3、HAL接口介紹

AliOS Things對於不同底層驅動的i2c操作實現,統一封裝成本文所述hal I2c接口。 hal相關頭文件位於目錄:include/aos/hal。hal相關實現位於具體的mcu目錄下,如:platform/mcu/haas1000/hal/。

3.1、API列表
image.png

3.2、API詳情

請參考include/aos/hal/i2c.h

3.2.1、相關宏定義

define I2C_MODE_MASTER 1 / i2c communication is master mode /

define I2C_MODE_SLAVE 2 / i2c communication is slave mode /

define I2C_MEM_ADDR_SIZE_8BIT 1 / i2c memory address size 8bit /

define I2C_MEM_ADDR_SIZE_16BIT 2 / i2c memory address size 16bit /

/*

  • Specifies one of the standard I2C bus bit rates for I2C communication

*/

define I2C_BUS_BIT_RATES_100K 100000

define I2C_BUS_BIT_RATES_400K 400000

define I2C_BUS_BIT_RATES_3400K 3400000

define I2C_HAL_ADDRESS_WIDTH_7BIT 0

define I2C_HAL_ADDRESS_WIDTH_10BIT 1

3.2.2、相關結數據結構

i2c_dev_t
typedef struct {

uint8_t      port;   /* i2c port */

i2c_config_t config; /* i2c config */

void        *priv;   /* priv data */

} i2c_dev_t;

i2c_config_t
typedef struct {

uint32_t address_width;

uint32_t freq;

uint8_t  mode;

uint16_t dev_addr;

} i2c_config_t;

3.2.3、hal_i2c_init

初始化指定I2C端口

函數原型

int32_t hal_i2c_init(i2c_dev_t *i2c)

參數
image.png

返回值

返回成功或失敗, 返回0表示I2C初始化成功,非0表示失敗

調用示例

define I2C1_PORT_NUM 1

define I2C2_PORT_NUM 2

define I2C2_SLAVE_ADDR 0x50

/ define dev master /

i2c_dev_t i2c_dev_master;

i2c_dev_t i2c_dev_slave;

/ i2c port set /

i2c_dev_master.port = I2C1_PORT_NUM;

/ i2c attr config /

i2c_dev_master.config.mode = I2C_MODE_MASTER;

i2c_dev_master.config.freq = I2C_BUS_BIT_RATES_3400K;

i2c_dev_master.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;

i2c_dev_slave.port = I2C2_PORT_NUM;

/ i2c attr config /

i2c_dev_slave.config.mode = I2C_MODE_SLAVE;

i2c_dev_slave.config.freq = I2C_BUS_BIT_RATES_3400K;

i2c_dev_slave.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;

i2c_dev_slave.config.dev_addr = I2C2_SLAVE_ADDR;

/ init master i2c with the given settings /

ret = hal_i2c_init(&i2c_dev_master);

/ init slave i2c with the given settings /

ret = hal_i2c_init(&i2c_dev_slave);

3.2.4、hal_i2c_master_send

master模式下從指定的I2C端口發送數據

函數原型

int32_t hal_i2c_master_send(i2c_dev_t i2c, uint16_t dev_addr, const uint8_t data, uint16_t size, uint32_t timeout)

參數
image.png

返回值

返回成功或失敗, 返回0表示I2C數據發送成功,非0表示失敗

調用示例
char pdata_send[10] = {0};

define I2C2_SLAVE_ADDR 0x50

ret = hal_i2c_master_send(&i2c_dev_master,I2C2_SLAVE_ADDR,pdata_send,10,50);

3.2.5、hal_i2c_master_recv

master模式下從指定的I2C端口接收數據

函數原型

int32_t hal_i2c_master_recv(i2c_dev_t i2c, uint16_t dev_addr, uint8_t data,uint16_t size, uint32_t timeout)

參數
image.png

返回值

返回成功或失敗, 返回0表示成功接收size個數據,非0表示失敗
char pdata_recv[10] = {0};

define I2C2_SLAVE_ADDR 0x50

ret = hal_i2c_master_recv(&i2c_dev_master,I2C2_SLAVE_ADDR,pdata_recv,10,50);

調用示例

3.2.6、hal_i2c_slave_send

slave模式下從指定的I2C端口發送數據

函數原型

int32_t hal_i2c_slave_send(i2c_dev_t i2c, const uint8_t data, uint16_t size, uint32_t timeout)

參數
image.png

返回值

返回成功或失敗, 返回0表示成功發送size個數據,非0表示失敗

調用示例
char pdata_send[10] = {0};

ret = hal_i2c_slave_send(&i2c_dev_slave,pdata_send,10,50);

3.2.7、hal_i2c_slave_recv

slave模式下從指定的I2C端口接收數據

函數原型

int32_t hal_i2c_slave_recv(i2c_dev_t i2c, uint8_t data, uint16_t size, uint32_t timeout)

參數
image.png

返回值

返回成功或失敗, 返回0表示成功接收size個數據,非0表示失敗

調用示例
char pdata_recv[10] = {0};

ret = hal_i2c_slave_recv(&i2c_dev_slave,pdata_recv,10,50);

3.2.8、hal_i2c_mem_write

向指定的設備內存寫數據

函數原型

int32_t hal_i2c_mem_write(i2c_dev_t i2c, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_addr_size, const uint8_t data, uint16_t size, uint32_t timeout)

參數
image.png

返回值

返回成功或失敗, 返回0表示成功發送size個數據,非0表示失敗

調用示例
char pdata[10] = {0};

ret = hal_i2c_mem_write(&i2c_dev_master,0x50,0x20,1,pdata,1,50);

3.2.9、hal_i2c_mem_read

從指定的設備內存讀數據

函數原型

int32_t hal_i2c_mem_read(i2c_dev_t i2c, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_addr_size, uint8_t data, uint16_t size, uint32_t timeout)

參數
image.png

返回值

返回成功或失敗, 返回0表示成功接收size個數據,非0表示失敗

調用示例
char pdata[10] = {0};

ret = hal_i2c_mem_read(&i2c_dev_master,0x50,0x20,1,pdata,1,50);

3.2.10、hal_i2c_finalize

關閉指定I2C端口

函數原型

int32_t hal_i2c_finalize(i2c_dev_t *i2c)

參數
image.png

返回值

類型:int 返回成功或失敗, 返回0表示I2C關閉成功,非0表示失敗。

調用示例

ret = hal_i2c_finalize(&i2c_dev_master);

4、案例介紹

HaaS EDU K1上自帶了多個傳感器,均為I2C方式訪問,這裡我們選取溫溼度SI7006的測試代碼用來介紹I2C是如何運作的。

4.1、硬件實現

硬件電路在開發板上默認是已經連接好了的,默認的I2C地址為0x40。。原理圖如下:
image.png

4.2、軟件設計

驅動代碼位於platform/board/haaseduk1/drivers/i2c.c

I2C部分測試代碼位於 application/example/edu_demo/mfg_test/sensors_test.c

獲取ID
si7006_getID(id_buf);

if (id_buf[4] == Si7006_TAG){

LOGI("si7006_test", "READ Si7006 Chip OK");

}

IIC驅動代碼
void si7006_init(void)
{

i2c_dev.port                 = 1;
i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
i2c_dev.config.freq          = I2C_BUS_BIT_RATES_400K;
i2c_dev.config.mode          = I2C_MODE_MASTER;
i2c_dev.config.dev_addr      = Si7006_ADDRESS;

hal_i2c_init(&i2c_dev);

}

uint8_t si7006_getVer(void)
{

uint8_t reg[2]  = {Si7006_READ_Firmware_Revision_0,Si7006_READ_Firmware_Revision_1};
uint8_t version = 0;

hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, reg, 2, 1000);
aos_msleep(30);
hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, &version, 1, 1000);
//LOGI("APP", "ver:0x%2x \n",version);
return version;

}

4.3、編譯與下載

4.3.1、代碼準備

打開edu_demo的產測開關

application/example/edu_demo/Config.in

在該文件中修改編譯選項,打開EDK_DEMO_FACTORY_TEST_ENABLIE開關。
config EDK_DEMO_FACTORY_TEST_ENABLIE

bool "enable factory test function"

default y


加入Demo到啟動代碼

application/example/edu_demo/app_entry.c

函數application_start中註釋掉menu_init();,添加sensors_test();

   //menu_init();
   
   sensors_test();


4.3.2、編譯

如下使用命令行方式
aos make distclean

aos make edu_demo@haaseduk1 -c config

aos make

4.3.3、燒錄

命令行方式
aos upload

圖形界面方式
詳見haaS EDU k1 快速開始 第4.3.3章節-使用GUI工具燒錄部分。

Leave a Reply

Your email address will not be published. Required fields are marked *