IIC协议
Overview
以 AC638N 为例,提供IIC协议应用示例、工程配置、API 介绍和常见问题。
应用示例
- 硬件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); } 
工程配置
- 在 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。 
常见问题
- IIC 通信 baudrate 值太大,则会引起 IIC 读写速度慢,需要留意该值配置。 
- 软件 IIC 可以指定任意引脚,但是硬件 IIC 只能跟随硬件 IO,硬件 IIC 的 IO 详情请查看对应封装的数据手册。 
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表示失败