0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

I2C总线的一种灵活控制方法

先楫半导体HPMicro 2023-07-11 10:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

I2C作为常用的通讯外设,广泛应用在各种通讯场合,而且也衍生各种变体协议,比如SCCB,SMbus,PMbus等等。先楫半导体在I2C这个通讯外设上,每个传输的阶段都可以独立自由去控制,这也极大得提高了开发的自由灵活度,而且也可以随性发挥生成I2C的变体协议,而不需要去进行IO模拟

首先介绍一下先楫半导体I2C的一些主要特性和功能,方便后续说明,大家也可以到官网参考先楫用户手册。

1

I2C 特征

支持标准模式 (100Kb/s),快速模式 (400Kb/s) 和快速模式 +(1Mb/s)

可配置主从模式

支持 7 位和 10 位地址模式

支持广播呼叫地址 (general call address)

自动时钟延展 (clock stretching)

可配置的时钟/数据时序

支持直接内存访问 (DMA)

4 字节 FIFO

2

I2C 功能

每个传输由 4 个阶段组成:起始,地址,数据和结束。在起始阶段会产生 START 操作,在地址阶段发送地址,在数据阶段 1 个或多个数据字节被传送,在结束阶段产生 STOP 操作。每个阶段都能够独立控制是否执行


4个字节FIFO,可不使用DMA的情况下,满足多字节一次性传输。并且软件没有准备好下一个字节的收发数据或者FIFO已满时候,I2C控制器会自动延展I2C总线时钟来暂停总线传输。


I2C控制器默认使能了自动ACK响应,即是除了最后一个字节外其余字节接收后都会自动发出ACK,软件可以使能字节接收中断来禁止自动响应功能,软件自己接收后决定是否发送ACK。

3

场合需求

在某些场合,当I2C作为主机的时候,一次数据量传输当中,可能会有以下的需求方式:


传输过程中间变化读写方向,比如START操作到第一个数据字节传输是写,后面变为读。或者读变成写。

传输过程中分三次传输,START,数据,STOP传输。比如第一次传输需要带START,但不需要STOP。

传输过程中需要restart重新发送start信号

举例,比如SMBUS,在进行block read传输中,就需要传输过程中发送restart信号,并且切换读写方向。

df9ce2f8-1f8e-11ee-a579-dac502259ad0.png

4

实现方式

先楫半导体的用户手册对于 I2C 的寄存器说明一共有好几个,本文重点介绍以下三个密切相关的寄存器:

1. CTRL寄存器:该寄存器是用来配置一次传输中的每个阶段的控制,比如主机模式下,方向是发送,在START开始后,STOP结束前,传输的是数据段,可以不发START,地址,STOP。那么可以对其寄存器的对应位进行开启和关闭。

dfb5c3c2-1f8e-11ee-a579-dac502259ad0.pngdfd1f3d0-1f8e-11ee-a579-dac502259ad0.png

2. INTEN寄存器的BYTERECV位,开启或关闭自动响应功能。

dff1d25e-1f8e-11ee-a579-dac502259ad0.png

3. CMD寄存器:定义的是对一次transaction的相关操作。比如主机在接收到从机的数据,需要不接受数据了,可以发送一个NACK响应。前提是关闭了自动响应功能。

e0189970-1f8e-11ee-a579-dac502259ad0.pnge031b45a-1f8e-11ee-a579-dac502259ad0.png

根据以上的寄存器说明,在新的sdk版本V1.2.0中,我们在SDK的i2c driver中看到有定义一个顺序传输接口,定义一个枚举,分别表示第一帧,中间帧,最后一帧。

/**

* @brief I2c sequentialtransfer options

* @arg: i2c_frist_frame: hasstart signal

* @arg: i2c_next_frame:middle transfer

* @arg: i2c_last_frame: hasstop signal

*/

typedef enum i2c_seq_transfer_opt{

i2c_frist_frame = 0,

i2c_next_frame,

i2c_last_frame,

}i2c_seq_transfer_opt_t;

对于发送接口,sdk1.2也提供了i2c_master_seq_transimit 这个 API

e0539016-1f8e-11ee-a579-dac502259ad0.png

对于接收接口,sdk1.2也提供了i2c_master_seq_receive这个API,从内部API可以看出是关闭自动响应,软件控制一次传输的ACK和NACK,避免STOP未出现时出现数据断开。

e09b0810-1f8e-11ee-a579-dac502259ad0.png

5

验证功能

根据以上信息,我们来操作一个实验,以sdk的poll例子的master和slave两个开发板进行相互收发,slave不做改动,master的读写接口替换以上的接口。

int main(void)

{

hpm_stat_t stat;

i2c_config_t config;

uint32_t freq;

board_init();

init_i2c_pins(TEST_I2C);

config.i2c_mode = i2c_mode_normal;

config.is_10bit_addressing = false;

freq = clock_get_frequency(TEST_I2C_CLOCK_NAME);

stat = i2c_init_master(TEST_I2C, freq, &config);

if (stat != status_success) {

return stat;

}

printf("I2C polling master example\n");

prepare_tx_data();

uint32_t index = 0;

uint32_t inc_len = 30;

if (status_success != i2c_master_seq_transmit(TEST_I2C, TEST_I2C_SLAVE_ADDRESS, &tx_buff[index], inc_len, i2c_frist_frame)) {

printf("Master transfer frist frame failed\n");

while (1) {

}

}

index += inc_len;

if (status_success != i2c_master_seq_transmit(TEST_I2C, TEST_I2C_SLAVE_ADDRESS, &tx_buff[index], inc_len, i2c_next_frame)) {

printf("Master transfer next frame failed\n");

while (1) {

}

}

index += inc_len;

inc_len = (sizeof(tx_buff) - (inc_len * 2));

if (status_success != i2c_master_seq_transmit(TEST_I2C, TEST_I2C_SLAVE_ADDRESS, &tx_buff[index], inc_len, i2c_last_frame)) {

printf("Master transfer last frame failed\n");

while (1) {

}

}

/* wait for slave controller to be ready to send data */

board_delay_ms(100);

index = 0;

inc_len = 30;

if (status_success != i2c_master_seq_receive(TEST_I2C, TEST_I2C_SLAVE_ADDRESS, &rx_buff[index], inc_len, i2c_frist_frame)) {

printf("Master transfer read frist framefailed\n");

while (1) {

}

}

index += inc_len;

if (status_success != i2c_master_seq_receive(TEST_I2C, TEST_I2C_SLAVE_ADDRESS, &rx_buff[index], inc_len, i2c_next_frame)) {

printf("Master transfer read next framefailed\n");

while (1) {

}

}

index += inc_len;

inc_len = (sizeof(tx_buff) - (inc_len * 2));

if (status_success != i2c_master_seq_receive(TEST_I2C, TEST_I2C_SLAVE_ADDRESS, &rx_buff[index], inc_len, i2c_last_frame)) {

printf("Master transfer read last framefailed\n");

while (1) {

}

}

check_transfer_data();

while (1) {

}

return 0;

}

实验现象

①当把一次完整传输拆分三次frame传输时候,依旧是没什么问题的。可见以上的功能使用并没有什么问题。

e0c8465e-1f8e-11ee-a579-dac502259ad0.png

② 可以模拟下一个配置错误的现象,开启auto-ack功能,master接收slave数据的数据,由于开启了自动响应,在第一包frame接收的时候,I2C控制器认为传输到最后一个字节,会自动补充NACK,但我们并不希望补充NACK,因为一次完整的传输还没完成,这时候就需要软件自己添加ACK或者NACK。

e0ebb076-1f8e-11ee-a579-dac502259ad0.png

6

小 结

对于I2C,无论是poll方式,还是中断方式,还是DMA方式,先楫的I2C控制器对于I2C传输的每个阶段都是可控的,这为开发者的应用需求也极大提高软件灵活度。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 总线
    +关注

    关注

    10

    文章

    3076

    浏览量

    92043
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1568

    浏览量

    132124
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    驱动之路#40:I2C通信机制分析(RK3576视角)

      在嵌入式开发中,I2C 应该算是出场率非常高的一种通信接口。像触摸芯片、PMIC、电源管理芯片、摄像头 sensor、RTC、EEPROM 等外设,很多都是通过 I2C 挂到主控上的。 调触摸
    的头像 发表于 06-01 17:14 1981次阅读
    驱动之路#40:<b class='flag-5'>I2C</b>通信机制分析(RK3576视角)

    SGM4541 I2C总线过压保护器:设计与应用的详细解析

    工程师们在设计I2C总线系统时提供了可靠的过压保护解决方案。今天,我们就来深入剖析这款保护器的关键特性、应用场景以及各项参数。 文件下载: SGM4541.pdf 、产品概述 SGM4541是
    的头像 发表于 03-17 16:30 550次阅读

    SGM4541A:I2C总线过压保护的理想之选

    SGM4541A:I2C总线过压保护的理想之选 在电子设备的设计中,I2C总线的稳定运行至关重要。而SGM4541A作为款低IQ
    的头像 发表于 03-17 16:30 311次阅读

    PCA9545A/45B/45C:4通道I2C总线开关的深度解析

    /45B/45C 4通道I2C总线开关,了解它的特性、功能以及在实际应用中的注意事项。 文件下载: PCA9545AD,118.pdf 、产品概述 PCA9545A/45B/45
    的头像 发表于 02-10 11:50 1280次阅读

    I2C总线-通信线缆长度的影响及改进措施

    I2C总线确实不适合远距离通信,尤其是需要使用线缆与I2C接口器件进行通信,这里的“不适合”并不是说不可以,这也是本文的重点。般使用I2C
    发表于 01-21 06:03

    探索PCF8584:I2C总线控制器的卓越之选

    探索PCF8584:I2C总线控制器的卓越之选 在电子工程师的日常工作中,选择合适的芯片来实现特定功能至关重要。今天,我们就来深入探讨款功能强大的
    的头像 发表于 12-28 15:40 902次阅读

    P82B715:I2C总线扩展的得力助手

    P82B715:I2C总线扩展的得力助手 在电子设计领域,I2C总线一种常用的通信协议,但它的总线
    的头像 发表于 12-26 10:20 1922次阅读

    基于FPGA的I2C控制模块设计

    I2C_WRITE_WDATA.v模块实现I2C写时序,I2C_Controller (I2C控制器)例化了
    的头像 发表于 12-26 09:48 6492次阅读
    基于FPGA的<b class='flag-5'>I2C</b><b class='flag-5'>控制</b>模块设计

    AS32X601的I2C模块操作EEPROM详解

    I2C接口模块实现了I2C协议的标准模式和快速模式,支持多主机I2C总线架构。其标准模式为100K,快速模式400K。而EEPROM,作为一种
    的头像 发表于 12-21 21:39 1820次阅读
    AS32X601的<b class='flag-5'>I2C</b>模块操作EEPROM详解

    I2C总线协议

    I2C 总线使用两根信号线(数据线 SDA 和时钟线 SCL)在设备间传输数据。SCL 为单向时钟线,固定由主机驱动。SDA 为双向数据线,在数据传输过程中由收发两端分时驱动。 I2C 总线
    发表于 12-15 08:07

    I2C死锁的问题

    和SDA信号变为高电平。 这样,I2C主设备等待从设备释放SDA信号,而同时I2C从设备又在等待主设备将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人
    发表于 12-04 06:00

    I2C的优点介绍

    了 PCB(印刷电路板)上的连接器和走线数量,从而节省了成本并实现了紧凑的系统设计。 多主多从配置: I2C支持多主多从配置,允许多个主设备与同一总线上的多个从设备进行通信。这种灵活性使得分布式处理架构
    发表于 11-27 07:49

    深入剖析I2C协议

    I2C也是一种可以多主设备,多从设备的总线协议,通过地址索引,I2C可以使能所需从设备,I2C的出现主要是用来实现不同集成电路组件之间的
    的头像 发表于 08-21 15:10 4086次阅读
    深入剖析<b class='flag-5'>I2C</b>协议

    嵌入式接口通识知识之I2C接口

    4.1 基本概念I2C的全称是Inter-Integrated Circuit,译为集成电路总线,是一种同步、双向、半双工的两线式串行接口总线。连接到
    发表于 08-14 14:46

    I2C总线通信,为什么要进行电气隔离?

    I2C总线采用双向二线制,支持多主机多从机通信,具备高可靠性、抗干扰能力强,广泛应用于嵌入式系统中。
    的头像 发表于 08-11 11:04 2804次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>通信,为什么要进行电气隔离?