13. IIC协议
Overview
以 AC638N 为例,提供IIC协议应用示例、工程配置、API 介绍和常见问题。
13.1. 应用示例
硬件IIC具体源代码详见 sdk/bsp/AC638N/src/iic_hw.c
软件IIC具体源代码详见 sdk/bsp/AC638N/src/iic_soft.c
iic_eeprom_test.c
中参考示例如下:void eeprom_test_main() { int i = 0; u8 flag = 0; iic_init(iic_dev); for (i = 0; i < 512; i++) { eeprom_wbuf[i] = i % 26 + 'A'; eeprom_rbuf[i] = 0; } puts(">>>> write in\n"); eeprom_write(iic_dev, eeprom_wbuf, 0, 128); puts("<<<< write out\n"); puts(">>>> read in\n"); eeprom_read(iic_dev, eeprom_rbuf, 0, 128); puts("<<<< read out\n"); for (i = 0; i < 128; i++) { if (eeprom_wbuf[i] != eeprom_rbuf[i]) { flag = 1; break; } } for (i = 0; i < 128; i++) { putchar(eeprom_rbuf[i]); putchar(' '); if (i % 16 == 15) { putchar('\n'); } } putchar('\n'); if (flag == 0) { puts("eeprom read/write test pass\n"); } else { puts("eeprom read/write test fail\n"); } iic_uninit(iic_dev); }
13.2. 工程配置
在 sdk/bsp/AC638N/board/board_demo.c 中配置软件或者硬件IIC:
/************************** IIC config ****************************/ #if TCFG_HW_IIC_ENABLE const struct hw_iic_config hw_iic_cfg[] = { //iic0 data { // SCL SDA .port = {IO_PORTC_04, IO_PORTC_05}, .baudrate = 100000, //IIC通讯波特率 .hdrive = 0, //是否打开IO口强驱 .io_filter = 1, //是否打开滤波器(去纹波) .io_pu = 1, //是否打开上拉电阻,如果外部电路没有焊接上拉电阻需要置1 .role = IIC_MASTER, }, }; #endif #if TCFG_SOFT_IIC_ENABLE const struct soft_iic_config soft_iic_cfg[] = { { //iic0 data .scl = IO_PORTC_02, //IIC CLK脚 .sda = IO_PORTC_03, //IIC DAT脚 .delay = 50, //软件IIC延时参数,影响通讯时钟频率 .io_pu = 1, //是否打开上拉电阻,如果外部电路没有焊接上拉电阻需要置1 }, #if 0 { //iic1 data .scl = IO_PORTA_06, .sda = IO_PORTA_07, .delay = 50, .io_pu = 1, }, #endif }; #endif
在 sdk/bsp/AC638N/src/iic_eeprom_test.c 中选择使用软件或者硬件IIC,本示例默认选择硬件IIC:
#define IIC_TYPE 1//0:soft iic 1:hw iic
在 sdk/apps/main.c 中函数
user_main()
添加如下工程代码:int user_main() { extern void eeprom_test_main(void); eeprom_test_main(); }
编译下载后,PC4 接 eeprom 设备的 SCL, PC5 接 eeprom 设备的SDA,观察打印的 eeprom 读写是否正常,正常一般会打印 eeprom read/write test pass。
13.3. 常见问题
IIC 通信 baudrate 值太大,则会引起 IIC 读写速度慢,需要留意该值配置。
软件 IIC 可以指定任意引脚,但是硬件 IIC 只能跟随硬件 IO,硬件 IIC 的 IO 详情请查看对应封装的数据手册。
13.4. API参考
IIC 常用相关 API 介绍,具体软件代码见 sdk/bsp/AC638N/src/iic_hw.c
和 bsp/AC638N/src/iic_soft.c
Functions
-
int hw_iic_init(hw_iic_dev iic)
初始化硬件iic
- Parameters
iic – iic句柄
- Returns
0 成功,< 0 失败
-
void hw_iic_uninit(hw_iic_dev iic)
关闭硬件iic
- Parameters
iic – iic句柄
- Returns
null
-
void hw_iic_suspend(hw_iic_dev iic)
挂起硬件iic
- Parameters
iic – iic句柄
- Returns
null
-
void hw_iic_resume(hw_iic_dev iic)
恢复硬件iic
- Parameters
iic – iic句柄
- Returns
null
-
void hw_iic_start(hw_iic_dev iic)
打开iic
- Parameters
iic – iic句柄
- Returns
null
-
void hw_iic_stop(hw_iic_dev iic)
关闭iic
- Parameters
iic – iic句柄
- Returns
null
-
u8 hw_iic_tx_byte(hw_iic_dev iic, u8 byte)
发送1个字节
- Parameters
iic – iic句柄
byte – 发送的字节
- Returns
1 收到应答,0 未收到应答
-
u8 hw_iic_rx_byte(hw_iic_dev iic, u8 ack)
接收1个字节
- Parameters
iic – iic句柄
ack – 1 接收字节后回复应答,0不回复应答
- Returns
接收的字节
-
int hw_iic_read_buf(hw_iic_dev iic, void *buf, int len)
接收len个字节
- Parameters
iic – iic句柄
buf – 接收缓冲区基地址
len – 期望接收长度
- Returns
实际接收长度,< 0表示失败
-
int hw_iic_write_buf(hw_iic_dev iic, const void *buf, int len)
发送len个字节
- Parameters
iic – iic句柄
buf – 发送缓冲区基地址
len – 期望发送长度
- Returns
实际发送长度,< 0表示失败
-
int hw_iic_set_baud(hw_iic_dev iic, u32 baud)
设置波特率
- Parameters
iic – iic句柄
baud – 波特率
- Returns
0 成功,< 0 失败
Functions
-
int soft_iic_init(soft_iic_dev iic)
初始化软件iic
- Parameters
iic – iic句柄
-
void soft_iic_uninit(soft_iic_dev iic)
关闭软件iic
- Parameters
iic – iic句柄
-
void soft_iic_suspend(soft_iic_dev iic)
挂起软件iic
- Parameters
iic – iic句柄
- Returns
null
-
void soft_iic_resume(soft_iic_dev iic)
恢复软件iic
- Parameters
iic – iic句柄
- Returns
null
-
void soft_iic_start(soft_iic_dev iic)
发送iic结束位
- Parameters
iic – iic句柄
- Returns
null
-
void soft_iic_stop(soft_iic_dev iic)
发送iic结束位
- Parameters
iic – iic句柄
- Returns
null
-
u8 soft_iic_tx_byte(soft_iic_dev iic, u8 byte)
发送1个字节
- Parameters
iic – iic句柄
byte – 发送的字节
- Returns
1 收到应答,0 未收到应答
-
u8 soft_iic_rx_byte(soft_iic_dev iic, u8 ack)
接收1个字节
- Parameters
iic – iic句柄
ack – 1 接收字节后回复应答,0不回复应答
- Returns
接收的字节
-
int soft_iic_read_buf(soft_iic_dev iic, void *buf, int len)
接收len个字节
- Parameters
iic – iic句柄
buf – 接收缓冲区基地址
len – 期望接收长度
- Returns
实际接收长度,< 0表示失败
-
int soft_iic_write_buf(soft_iic_dev iic, const void *buf, int len)
发送len个字节
- Parameters
iic – iic句柄
buf – 发送缓冲区基地址
len – 期望发送长度
- Returns
实际发送长度,< 0表示失败