This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] ADS112C04:使用 I2C 进行完整性检查

Guru**** 2563000 points
Other Parts Discussed in Thread: ADS112C04, TMS320F280049, ADS1248

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/911848/ads112c04-sanity-check-with-i2c

器件型号:ADS112C04
主题中讨论的其他器件:TMS320F280049ADS1248

大家好、

我正在尝试使用 TMS320F280049通过 I2C 协议与 ADS112C04通信。 作为起点、我编写了一个简单的代码以完成完整性检查、并附上 以下代码。 当我运行代码时、我没有从配置寄存器1获得预期的读取值、配置寄存器1是我在代码中配置的唯一寄存器。 有人能帮我解决这个问题吗?

#include"F28x_Project.h"

void main (void)


//初始化系统控制、GPIO 引脚、中断

uint16_t R1 = 0x0012;
uint16_t R2 = 0x0034;
uint16_t R3 = 0x0056;
uint16_t R4 = 0x0000;
InitSysCtrl();
InitGpio();

EALLOW;

GpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 2;// I2CA_SDA
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;//输入限定:异步
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;//上拉使能

GpioCtrlRegs.GPAGMUX2.bit.GPIO27 = 2;// I2CA_SCL
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;//输入限定:异步
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;//上拉使能

GpioCtrlRegs.GPBGMUX2.bit.GPIO56 = 0;// IRQ_1
GpioCtrlRegs.GPBMUX2.bit.GPIO56=0;

EDIS;

I2caRegs.I2CMDR.bit.IRS = 0;// I2C 被禁用

I2caRegs.I2CPSC.bit.IPSC = 49;//系统时钟分频值
I2caRegs.I2CCLKL = 5;//低分频器
I2caRegs.I2CCLKH = 5;//高时间分频器
I2caRegs.I2CMDR.bit.MST = 1;//主控模式
I2caRegs.I2CMDR.bit.TRX = 1;//发送器模式
I2caRegs.I2CMDR.bit.BC = 0;//每个数据字节8位
I2caRegs.I2CCNT = 10;//数据计数
I2caRegs.I2CSAR.bit.SAR = 0x40;//从地址寄存器
I2caRegs.I2COAR.bit.OAR = 0x3C;// I2C 自有地址寄存器
I2caRegs.I2CMDR.bit.DLB = 0;//数字回路被启用
I2caRegs.I2CMDR.bit.FREE = 1;// I2C 以自由模式运行

I2caRegs.I2CMDR.bit.IRS = 1;// I2C 被启用


I2caRegs.I2CDXR.bit.data = 0x06;//复位命令
DELAY_US (1);
I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号
I2caRegs.I2CDXR.bit.data = 0x44;// WREG 命令和配置寄存器(CR 1)地址
//I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号
I2caRegs.I2CDXR.bit.data = 0x02;// CR 1数据
I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号
I2caRegs.I2CDXR.bit.data = 0x24;// RREG 命令和 CR 1地址
//I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号

R4 = I2caRegs.I2CDRR.bit.data;//数据接收操作


for (;;)

此致、

葡萄园  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vineyeth、

    我建议使用逻辑分析仪或示波器来验证您的通信是否符合预期、并且没有任何问题(您能否将其发送给我?)  从代码中不清楚您使用的通信 SCL 时钟频率是多少。  发出重置后、您可能等待的时间不够长。

    我们不知道您的 WREG 是否在工作。  在这种情况下、查看通信图会有所帮助。  WREG 命令非常简单。  RREG 命令要求命令 RREG 通过写入 ADS112C04、然后读取数据来实现。  

    RREG 要求以写入模式发送器件地址、后跟一个数据字节(RREG 命令)。  在您再次发送器件地址并以读取模式在下一个字节中从器件读取数据(这要求主器件发送 SCL 时钟)之后、立即发送器件地址。

    此致、

    Bob B  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    感谢您的回复。

    我想告诉大家、我是这里的初学者。 对于示波器截图、我将示波器连接到 SDA 和 SCL 引脚并记录该图、这是正确的方法吗?  

    很抱歉、我无法遵循您对 RREG 命令所说的内容。 我所了解的是,首先我需要发送设备地址> RREG >设备地址> RDATA 是否正确? (我在下面标有红色的代码中写下了我从您的建议中收集到的内容)

    我的计算如下

    我的 SYSCLK 为100MHz

    因此、用 IPSC +1 = 2MHz (IPSC = 49)分频该值

    对于 I2C 模块时钟计算 d = 5、高时钟分频和低时钟分频值选择为5

    因此 I2C 主时钟 时间周期=[(ICCH + d)+(ICCL + d)]/I2C 模块时钟=[(5 + 5)+(5 + 5)]/20Mhz = 1微秒

                主频率= 100KHz

    由于我对其进行了编辑、我将再次在此处附加代码

    #include"F28x_Project.h"

    void main (void)

    //初始化系统控制、GPIO 引脚、中断

    uint16_t R1 = 0x0012;
    InitSysCtrl();
    InitGpio();

    EALLOW;

    GpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 2;// I2CA_SDA
    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;//输入限定:异步
    GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;//上拉使能

    GpioCtrlRegs.GPAGMUX2.bit.GPIO27 = 2;// I2CA_SCL
    GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;//输入限定:异步
    GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;//上拉使能

    GpioCtrlRegs.GPBGMUX2.bit.GPIO56 = 0;// IRQ_1
    GpioCtrlRegs.GPBMUX2.bit.GPIO56=0;

    EDIS;

    I2caRegs.I2CMDR.bit.IRS = 0;// I2C 被禁用
    I2caRegs.I2CPSC.bit.IPSC = 49;//系统时钟分频值
    I2caRegs.I2CCLKL = 5;//低分频器
    I2caRegs.I2CCLKH = 5;//高时间分频器
    I2caRegs.I2CMDR.bit.MST = 1;//主控模式
    I2caRegs.I2CMDR.bit.TRX = 1;//发送器模式
    I2caRegs.I2CMDR.bit.BC = 0;//每个数据字节8位
    I2caRegs.I2CCNT = 10;//数据计数
    I2caRegs.I2CSAR.bit.SAR = 0x40;//从地址寄存器
    I2caRegs.I2COAR.bit.OAR = 0x3C;// I2C 自有地址寄存器
    I2caRegs.I2CMDR.bit.DLB = 0;//数字回路被启用
    I2caRegs.I2CMDR.bit.FREE = 1;// I2C 以自由模式运行
    I2caRegs.I2CMDR.bit.IRS = 1;// I2C 被启用

    I2caRegs.I2CDXR.bit.data = 0x06;//复位命令
    DELAY_US (10);
    I2caRegs.I2CMDR.bit.STT = 1;//生成起始信号(1)
    I2caRegs.I2CDXR.bit.data = 0x80;//从器件地址和写入位
    I2caRegs.I2CDXR.bit.data = 0x44;// WREG 命令和配置寄存器1地址
    I2caRegs.I2CDXR.bit.data = 0x02;// CR 1数据
    I2caRegs.I2CMDR.bit.STP= 1;//生成停止信号 (2)。在这之后、我直到n`t 代码结束才得到任何响应
    DELAY_US (10);
    I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号  
    I2caRegs.I2CDXR.bit.data = 0x80;//从器件地址和写入位
    I2caRegs.I2CDXR.bit.data = 0x24;// RREG 命令和 CR 1地址
    I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号
    I2caRegs.I2CDXR.bit.data = 0x81;//从器件地址和读取位
    I2caRegs.I2CMDR.bit.STP= 1;//生成停止信号

    while (I2cRegs.I2CSTR.bit.BB!=0)


    I2caRegs.I2CSTR.bit.RRDY = 1;//生成停止信号

    R4 = I2caRegs.I2CDRR.bit.data;//数据接收操作


    for (;;)

    以下是当我在程序中标记行(1)和(2)相同时得到的范围截图。

    在 (1)和(2)之间、我没有在这两个引脚上获得任何响应、在(2)之后、我也没有获得任何捕获响应。

    此致、

    葡萄园

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vineyeth、

    第一个示波器屏幕截图显示您正在使用写入地址0x40对器件进行寻址。  第9个 SCL 的响应应该是低电平(ACK)、但在这种情况下、寻址的器件发出一个 NACK。  确保 ADS112C04的地址引脚 A0和 A1都连接到低电平。 因此、您需要做的第一件事是确保收到通信的 ACK。

    对于标有红色的部分、第一部分看起来是正确的、但您需要发送 SCL 以从 ADS112C04读取数据。  ADS112C04是从器件、不会启动 SCL。  要读取数据、SCL 必须来自主器件(微型)。

    因此、WREG 写入是最简单的部分、因此让我们首先专注于此通信、以确保您收到来自 ADS112C04的 ACK。  此外、在示波器图上显示足够多的内容以查看整个通信。  您应该会看到传输的3个字节;地址、命令和数据。

    此致、

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    感谢您的快速响应。  

    我在这里有点困惑、我想知道您如何能够分辨出我正在使用示波器快照中的地址0x40对器件进行寻址。 如果我的观察结果正确、数据将在时钟脉冲的高电平时间进行计数。 如果是这种情况、我将读取10000000数据、并使用您刚才所说的 NACK 位、或者您的观察结果基于代码前面定义的地址。 恐怕在第一个示波器脉冲上无法获得 START 信号、因为时钟的低侧会发生从高电平到低电平的转换。 为什么在发出 START 命令之前时钟脉冲为低电平、在上拉时该脉冲应为高电平。  

    如何为您指出的读取过程生成时钟脉冲、是否有任何特定的命令用于相同的过程? (如 ADS1248中的 NOP)

    n`t 示波器快照、当我仅执行第(1)行时、我会得到任何示波器响应、我不知道原因。 我是否需要按照任何顺序写入 START 命令、如在首先写入所有配置之后、然后启动类似或其他的 START 命令。  

    同时、我将检查并确保 ADS112C04的地址引脚 A0和 A1都连接到低电平。 如果我可以为您提供任何改进或更多示波器截图、将尽快返回给您。

    Bob、非常乐于助人、谢谢。

    此致、

    葡萄园

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    我想我一直将 ADC 保持在复位状态、我从您回答的另一个线程中发现了这一点。 无论如何、现在已更正、下面是我现在获取的示波器截图。

    我检查了 A0和 A1之间的接地导通性,这是可以的。

    我n`t 了相关代码部分、除了 ADC 复位之外、我没有更改任何配置。

    GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;// ADC 保持在复位状态

    I2caRegs.I2CMDR.bit.IRS = 0;// I2C 被禁用
    I2caRegs.I2CPSC.bit.IPSC = 49;//系统时钟分频值
    I2caRegs.I2CCLKL = 5;//低分频器
    I2caRegs.I2CCLKH = 5;//高时间分频器
    I2caRegs.I2CMDR.bit.MST = 1;//主控模式
    I2caRegs.I2CMDR.bit.TRX = 1;//发送器模式
    I2caRegs.I2CMDR.bit.BC = 0;//每个数据字节8位
    I2caRegs.I2CCNT = 10;//数据计数
    I2caRegs.I2CSAR.bit.SAR = 0x40;//从地址寄存器
    I2caRegs.I2COAR.bit.OAR = 0x3C;// I2C 自有地址寄存器
    I2caRegs.I2CMDR.bit.DLB = 0;//数字回路被禁用
    I2caRegs.I2CMDR.bit.FREE = 1;// I2C 以自由模式运行
    I2caRegs.I2CMDR.bit.IRS = 1;// I2C 被启用

    GpioDataRegs.GPBSET.BIO34 = 1;// ADC 从复位状态释放

    I2caRegs.I2CDXR.bit.data = 0x06;//复位命令

    DELAY_US (10);

    I2caRegs.I2CMDR.bit.STT = 1;//生成起始信号 (1)
    DELAY_US (10);
    I2caRegs.I2CDXR.bit.data = 0x80;//从器件地址和写入位 (2)
    I2caRegs.I2CDXR.bit.data = 0x44;// WREG 命令和配置寄存器1地址
    //I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号
    I2caRegs.I2CDXR.bit.data = 0x02;// CR 1数据
    I2caRegs.I2CMDR.bit.STP= 1;//生成停止信号
    //DELAY_US (10);
    I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号
    I2caRegs.I2CDXR.bit.data = 0x82;//从器件地址和写入位
    I2caRegs.I2CDXR.bit.data = 0x24;// RREG 命令和 CR 1地址
    I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号
    I2caRegs.I2CDXR.bit.data = 0x81;//从器件地址和读取位
    I2caRegs.I2CDXR.bit.data = 0x10;// RDATA

     

    当我执行第(1)行(在代码中标记为红色)时,将获得上述范围快照。


    以上示波器截图是我执行行(2)时(在代码中以红色标记)

    我认为我没有从从器件获取 ACK、但它是在上图中获得的。 如果是这样、原因是什么?  

    在执行 RESET 命令之前,是否还需要发送从机地址和启动信号?

    如果我在代码中将一个字设置为10时仅传输一个字,数据计数是否会起作用?

    此致、

    葡萄园

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vineyeth、

    除了常规调用复位命令(其中 I2C 链中的所有器件都将复位)之外、所需器件必须在开始条件之后寻址。 所有通信都应以"开始"条件开始、以"停止"条件结束。 7位地址作为"开始"后的第一个字节进行左对齐。  第8位是 R/W 位。  当我在示波器0x80上看到时、这会告诉我地址是100 0000b (0x40)、R/W 位是0、这意味着它是一个写入。  若要从同一地址读取、它应在示波器上显示为0x81。

    第一个示波器屏幕截图中显示的是 Start + 0x82 (ACK)+ 0x06 (ACK)、这将是具有低功耗(写入)的 I2C 地址0x41 + 0x06、这是 ADS112C04的 RESET 命令。  这似乎根本不遵循您的代码。  因此、您可能需要更好地了解代码相对于所使用的微控制器而言是如何针对 I2C 工作的。  您还应查看数据表中的 ADS112C04命令第8.3节、了解该流程的工作原理和每个命令的字节顺序。

    由于地址0x41有 ACK、您是否连接了另一个 I2C 器件?

    此致、

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    我对这个错误表示歉意。 我有两个 ADC 连接到我的微控制器。 由于我在处理代码时遇到问题、我将从器件地址更改为0x41、以检查我是否从其他从器件获得了确认。 现在我将其设置回0x40。

    我现在将重点介绍代码的以下部分。 这是 I2C 配置后的第一组代码。

    I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号
    I2caRegs.I2CDXR.bit.data = 0x80;//从器件地址和写入位
    I2caRegs.I2CDXR.bit.data = 0x06;//复位命令
    //I2caRegs.I2CMDR.bit.STT = 1;//生成 START 信号
    DELAY_US (10);
    I2caRegs.I2CMDR.bit.STP= 1;//生成停止信号

    正如您所说的、我已经开始与起始信号和给定从器件地址以及重置命令进行通信。 以下是根据上述代码获得的示波器截图。

    START 信号之后获得的示波器脉冲。 从机应答成功。  

    时钟是否有任何原因保持在低电平状态、或者它只是因为至今未生成停止条件。

    0x80命令后获得的示波器截图  

    在这里、从器件正在生成 NACK。 在从器件应答到同一地址之前。

    之后的 RESET 命令不会产生响应、为什么会发生这种情况?

    当我在代码中标记为红色的位置给出 START 信号时、我观察到另一种方式、而不是在我之前给出的位置(第一行)。 我获得 了以下示波器截图。

    在这里、从器件地址和复位命令都被确认。

    我的代码段是否有任何问题?

    我的数据计数现在为3、它是否会影响配置寄存器的通信?

     

    谢谢、

    葡萄园

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vineyeth、

    完成通信事务后、必须始终发出停止条件。  否则、一旦执行初始命令、从器件将不知道如何响应。

    至于您的代码序列、您需要咨询负责微控制器的论坛。  我完全不熟悉硬件寄存器命令的发送、因此微控制器的技术参考可能会为您提供有关该流程的一些指导。

    此致、

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    我在代码中给出了停止条件、但不确定它的位置。 或者、我是否需要在每次通信之后提供停止信号、这意味着在每个 I2CDXR.bit .data 命令之后?

    我会在微论坛中询问代码相关的疑问、感谢您的建议。

    如果有任何改进、我会告诉您。  

    谢谢、

    葡萄园

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vineyeth、

    数据表通信示例中显示了启动、重复启动和停止条件。  有关传输的基本数据格式、请参阅图55。  图57 - 63显示了在事务中不同命令的起始条件和停止条件的位置。

    此致、

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    我已经浏览过数据表。 但我对编码部分有一些疑问、我已经联系过微型论坛。 让我看看他们必须告诉什么。

    如果我能很快找到解决方案、我将在同一主题中更新详细信息。 我认为这将有助于未来的人。

    谢谢、

    葡萄园  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    感谢您的建议。 我将深入研究、并在收到微团队的一些建议后继续前进。

    无论如何、感谢您抽出宝贵的时间、您的支持对我们的初学者来说非常重要。

    此致、

    葡萄园