前言
TLSR8258支持硬件I2C串行总线,可作为主模式(master)和从属模式(slave)
泰凌微I2C模块支持标准模式100kbps和快速模式400kbps,但必须保证系统时钟频率是通信速率的10倍以上
本章主要讲解下I2C主模式master下的使用,如有异议,欢迎留言指正
功能管脚
- 复用引脚必须成对匹配
SDA | SCL |
---|---|
GPIO_PA3 | GPIO_PA4 |
GPIO_PB6 | GPIO_PD7 |
GPIO_PC0 | GPIO_PC1 |
GPIO_PC2 | GPIO_PC3 |
寄存器
- I2CSP [0x00]:分频寄存器,仅master模式需要配置,时钟计算公式为
I2C clock = system clock / (4*divclock)
- I2C_ID [0x01]:从设备地址寄存器,最低位为读写位
- I2CMST [0x02]:状态寄存器,获取当前是否忙与ACK接收状态
- I2CSCT0 [0x03]:控制寄存器0,配置主从模式与slave读写内存地址映射
- I2CAD [0x04]:master模式下的数据缓存,高8位
- I2CDW [0x05]:master模式下的数据缓存,低8位
- I2CDR [0x06]:读写数据寄存器
- I2CSCT1 [0x07]:控制寄存器1,配置I2C发送数据的流程与使能ack读取
- 如可以配置流程顺序为
start->0x01->0x04->0x05->0x06->stop
- 如可以配置流程顺序为
- I2CMAP_HADR [0xe0]:映射模式下I2C从模式数据接收缓存地址读取
- HOSR_ADR[0xe1~0xe3]:从模式下映射模式缓存地址,重定向到sram地址
- I2CMAP_HOST [0xe4]:从模式下的中断状态,主机读写后触发,写1清除
配置流程
DMA模式
- 仅slave支持DMA模式
代码实例
驱动代码可以参考i2c.c
文件
接口API
- i2c_master_init:初始化时钟与从机地址
- i2c_write_byte:主机写一个字节数据到从机
- i2c_read_byte:主机到从机读一个字节数据
- i2c_write_series:主机写入一包数据到从机
- i2c_read_series:主机到从机读取一包数据
例程代码参考app_i2c_master.c
文件
- 初始化i2c主机模式
void i2c_master_test_init(void)
{i2c_gpio_set(I2C_GPIO_GROUP_C0C1); //管脚映射PC0 PC1i2c_master_init(0x5C, (unsigned char)(CLOCK_SYS_CLOCK_HZ/(4*200000)) );//从机地址0x5C(写) 0x5D(读),200K总线时钟
}
- I2C master读写测试程序
unsigned char regAddr_WriteCMD = 0x01; //从机寄存器写地址
unsigned char regAddr_ReadCMD = 0x11; //从机寄存器读地址unsigned char i2c_master_tx_buff[2] = {0x11, 0x22};//写入数据缓存
unsigned char i2c_master_rx_buff[2];//读取数据缓存void i2c_master_mainloop(void)
{ i2c_write_series(regAddr_WriteCMD, 1, (unsigned char *)i2c_master_tx_buff, sizeof(i2c_master_tx_buff));//往寄存器0x01写入两个字节i2c_read_series(regAddr_ReadCMD, 1, (unsigned char *)i2c_master_rx_buff, sizeof(i2c_master_rx_buff));//从寄存器0x11读取两个字节数据
}
问题勘误
由于设计上SPI模块和I2C模块在芯片内部共享了部分硬件资源,所以在软件上无法做到I2C和SPI从机模式同时使用