车载A2B芯片AD2428 IIC功能介绍

一,功能描述

A2B收发器在节点之间的距离上连接多通道I2S(IC间声音)同步脉冲编码调制(PCM)数据(电缆长度在产品数据表中指定)。它还将I2S的同步、时分复用特性扩展到连接多个节点的系统,其中每个节点都可以消耗数据、提供数据或两者兼而有之。

A2B收发器通过多通道I2S/TDM接口与通用DSP、FPGA、ASIC、麦克风、ADC、DAC和编解码器直接接口,支持这些A2B功能。A2B总线链路上的数据是曼彻斯特编码的。收发器还完全支持A2B链路上的I2C通信。A2B收发器可用于从节点或主节点。默认情况下,收发器作为从收发器启动,但如果主机设置了A2B_CONTROL.MSTR位,则可以配置为主收发器。

具有四个节点的简化A2B系统图显示了一个简单的A2B系统示例。主机程序在每个节点中注册,以控制A2B总线上的数据流量。来自从属节点0和2的麦克风数据被传递到主机,从属节点1和2的扬声器数据从主机传递到DAC。

在这里插入图片描述

二,架构概念

以下部分提供了描述硬件块、接口和互连的信息。

2.1 I2C接口

I2C接口用于从本地连接的主机直接访问收发器寄存器空间,并通过A2B总线在主收发器和系统中任何发现的从节点之间远程交换I2C数据。该协议被称为远距离I2C,其中交换的I2C数据嵌入同步控制帧SCF(下游,从主设备到目标从设备)和同步响应帧SRF(上游,从目标从设备到主设备)中。

收发器中的I2C接口与高达5V的逻辑电平兼容,并具有以下功能:

  • A2B主节点中的仅从属操作
  • A2B从节点中的主、多主或从操作
  • 以100k或400k bits/s的速率运行,由A2B_I2CCFG.DATARATE位配置
  • 7位寻址
  • 时钟伸展

注意:主节点上的A2B主机必须支持I2C时钟扩展,以便与主节点连接收发器。

配置为主收发器的收发器识别两个I2C设备地址:

  • BASE_ADDR-用于通过I2C端口直接访问其寄存器空间
  • BUS_ADDR-用于使用I2C远距离协议通过A2B总线远程访问从节点寄存器和从节点I2C外围设备

I2C BASE_ADDR由通电复位时ADR2/IO2和ADR1/IO1引脚上的逻辑电平设置,从而为连接到同一I2C总线的多达四个主设备提供支持。7位设备地址的LSB决定了I2C数据交换是使用BASE_ADDR(位1=0)访问收发器,还是使用BUS_ADDR(位1=1)通过启用主控的收发器访问总线节点,如I2C地址表所述。
在这里插入图片描述
配置为从属的收发器无法识别BUS_ADDR。在从收发器上,I2C接口允许I2C主站和从站行为。当收发器通过A2B总线从主机接收远程I2C外围设备访问请求时,它作为I2C主机。然后,该从属收发器作为I2C主机将接收到的I2C事务转发到其A2B_CHIP寄存器中编程的I2C从属地址。当本地外部控制器通过I2C端口访问收发器寄存器(BASE_ADDR)时,它作为I2C从机。

注意:虽然本地外部控制器可以对从属收发器的寄存器空间进行编程,但远程主机必须通过A2B总线写入A2B_SWCTL、A2B_RESPCYCS、A2B_SLOTFMT、A2B_DATCTL、A2B_ RAISE和A2B_GENER寄存器。从本地I2C端口写入这些寄存器中的任何一个都不会对寄存器产生影响。

收发器上的I2C接口允许在PLL锁定之前进行寄存器编程。动作写入1(W1A)位(例如,A2B_CONTROL.ENDDSC和A2B_CONTROL.NEWSTRCT)在PLL锁定之前无效,因为协议引擎仍处于重置状态。

注意:在PLL锁定之前,A2B_SWCTL、A2B_SLOTFMT、A2B_DATCTL和A2B_DISCVRY寄存器不能写入主收发器。在PLL锁定建立之前对这些寄存器的写入无效。

警告:系统软件的设计必须避免从A2B主机(通过A2B总线)和本地处理器(通过I2C端口)同时写入同一从属寄存器。当发生写入争用时,两个写入都完成了,但它们完成的顺序是不可预测的。

2.2 I2C时钟拉伸

收发器使用I2C时钟扩展功能来确保I2C访问有足够的时间进行处理。它主要用于通过A2B总线对从节点收发器和从节点I2C外围设备进行主机I2C访问。时钟拉伸由主机在以下时间响应主机I2C访问而启动:

  • 在写访问期间——在每个数据字节后的确认位之前
  • 在读取访问期间——在读取请求后的确认位之前
  • 在多于一个字节的突发读/写访问期间——在后续数据字节的第一位之前

将SCL信号拉低向主机表明收发器需要更多时间来处理请求。一旦收发器准备好确认请求,它就会让SCL信号变高,这样主机就可以重新控制SCL,并继续进行确认(ACK)和下一个字节。

重要提示:在A2B系统设计中,主机(I2C主机)必须支持I2C时钟扩展。
当从节点中的外围设备延长I2C时钟时,SCL信号也会在主收发器和主机之间延长。如果外围设备在32个超帧的时间内没有释放SCL信号,则主设备会注册超时(A2B_INTPND2.I2CERR=1),释放SCL,并停止延长主机时钟。此超时可确保从属外围设备无法使主机的I2C接口永久停止。

2.3 收发器I2C接口

7位设备地址的LSB决定了I2C数据交换是使用BASE_ADDR(位1=0)访问收发器,还是使用BUS_ADDR(位1=1)通过主配置的收发器访问总线节点,如下表所示。
在这里插入图片描述

A2B收发器支持以下读写操作:

  • 单字写入操作——A2B主设备(I2C从设备)在第九个时钟脉冲期间通过将SDA拉低来发出确认,从而完成访问。
  • 突发模式写入序列——收发器在每个数据字节后自动递增寄存器地址指针,因此可以在不重新编程地址的情况下写入顺序数据寄存器。
  • 单字读取操作-第一个读/写(R/W)位为0,表示写入操作。这是因为仍然必须写入寄存器地址才能设置内部地址。在I2C从属设备确认收到寄存器地址后,I2C主设备必须发出重复的启动命令,然后是R/W位设置为1(读取)的芯片地址字节。这导致I2C数据线SDA反转方向并开始将数据驱动回I2C主设备。然后,I2C主设备每九个脉冲向从设备发送一个确认脉冲。
  • 突发模式读取序列-收发器在每次读取数据字节后自动递增寄存器地址指针,因此可以在不重新编程地址的情况下读取顺序数据寄存器。

通过I2C接口进行数据传输需要以下步骤:

  1. 数据传输由连接到A2B收发器的微控制器启动。
  2. 微控制器建立启动条件(SDA上的高到低转换,而SCL保持高),这表示地址/数据流随之而来。
  3. 在接下来的八个SCL周期中,A2B收发器从主机接收7位地址和R/W位(MSB优先)。
  4. A2B收发器识别所传输的地址,并在第九个时钟脉冲(确认位)期间通过将数据线拉低来做出响应。

R/W位决定数据的方向。当第一个字节的LSB被清除(=0)时,主机将信息写入主机。当第一个字节的LSB设置为(=1)时,主机从主机读取信息。数据传输一直持续到遇到停止条件(SDA从低转变为高,而SCL保持高)。寄存器地址指针自动递增,以支持主设备和从设备的突发模式I2C写入和突发模式I2C读取。

I2C格式图显示了以下I2C操作的格式:

  • 写入BASE_ADDR/BUS_ADDR可以包含一个或多个字节的数据。设备地址后的第一个字节设置设备中的寄存器地址。后续字节被写入寻址寄存器。由于地址指针在每次写入后递增,因此可以在单个事务中写入顺序寄存器。
  • 从BASE_ADDR/BUS_ADDR读取的数据可以包含一个或多个字节的数据。带有写指示的设备地址后面是设备中的寄存器地址和带有读访问指示的重复设备地址。
    在这里插入图片描述

重复设备地址后的第一个字节包含所寻址寄存器的值。设备地址后的第一个字节设置设备中的寄存器地址。它后面是重复的设备地址,但带有读取访问指示。后续字节包含自动递增的寄存器地址的值。
I2C写入时序图显示了I2C写入时序。
在这里插入图片描述

I2C读取时序图显示了I2C读取时序。
在这里插入图片描述

2.4 收发器I2C访问延迟

当通过A2B总线远距离访问远程收发器时,会产生延迟。I2C访问的总线延迟表中提供了不同类型I2C访问的A2B总线延迟。
在这里插入图片描述
在这里插入图片描述

例如,考虑正在写入远程外围设备(连接到从节点)寄存器的情况。在I2C访问延迟图中,I2C访问延迟用绿色箭头标记。
在这里插入图片描述

注意:I2C访问的总线延迟表中描述的延迟适用于没有冲突的访问。如果I2C消息没有立即得到确认,或者由于GPIO中断、线路故障中断、I2C问题(NACK)等更高优先级的事件而被推迟,则尝试执行消息交换之前产生的延迟不包括在表中提供的值中。

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C# CH341B芯片IIC读写是指使用C#编程语言来控制CH341B芯片进行IIC总线读写操作。CH341B芯片是一种USB转串口/IIC/SPI等多种通讯方式的芯片,可以通过USB接口连接到计算机,然后通过编程控制实现对IIC总线设备的读写操作。 在C#中,可以使用CH341DLL.dll库来访问CH341B芯片,该库提供了一系列函数,可以实现对CH341B芯片的控制。以下是一个简单的C#代码示例,用于实现对IIC设备的读写操作: ``` using System; using System.Runtime.InteropServices; namespace IICDemo { class Program { [DllImport("CH341DLL.dll")] private static extern bool CH341OpenDevice(int iIndex); [DllImport("CH341DLL.dll")] private static extern bool CH341CloseDevice(int iIndex); [DllImport("CH341DLL.dll")] private static extern bool CH341SetStream(int iIndex, int iMode, int iSpeed); [DllImport("CH341DLL.dll")] private static extern bool CH341StreamI2C(int iIndex, byte bAddr, byte[] pWriteData, int iWriteLength, byte[] pReadData, int iReadLength); static void Main(string[] args) { // 打开设备 if (!CH341OpenDevice(0)) { Console.WriteLine("打开设备失败!"); return; } // 设置通讯模式和速率 if (!CH341SetStream(0, 0x01, 100000)) { Console.WriteLine("设置通讯模式和速率失败!"); return; } // 写入数据 byte[] writeData = new byte[] { 0x00, 0x01, 0x02 }; if (!CH341StreamI2C(0, 0x50, writeData, writeData.Length, null, 0)) { Console.WriteLine("写入数据失败!"); return; } // 读取数据 byte[] readData = new byte[3]; if (!CH341StreamI2C(0, 0x50, null, 0, readData, readData.Length)) { Console.WriteLine("读取数据失败!"); return; } Console.WriteLine("读取到的数据:"); foreach (var data in readData) { Console.Write("{0:x2} ", data); } // 关闭设备 CH341CloseDevice(0); } } } ``` 以上代码示例实现了使用CH341B芯片IIC设备写入数据,并读取数据的操作。需要注意的是,在使用该代码前需要先安装CH341驱动程序,并将CH341DLL.dll库文件复制到项目目录中。如果需要更多关于C# CH341B芯片IIC读写的信息,可以参考相关文档或者教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

音频金钟小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值