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.cbsp/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表示失败