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.

[参考译文] I2C3的 I2CReadWrite 函数

Guru**** 2466550 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/665211/i2creadwrite-function-with-i2c3

尊敬的 TI 专家:

我正在使用 TM4C123GXL 器件进行项目、需要从连接到 TM4C123GXL 板的 I2C 从器件进行写入和读取。
 是否有从器件读取写入的任何可能函数?


我使用 了 I2CMRead 函数、该函数可从库中获取、如下图所示安装、但读/写操作不正确。

ERROR_t TI_I2C_WriteRead (无符号字符 SLA、
               int num_WRITE_Bytes、
               unsigned char write_data[]、
               int num_read_Bytes、
               unsigned char read_buffer [])


   返回 I2CMRead (&TFA_sI2CInst、SLA、
                            Write_data、
                            num_WRITE_Bytes、
                            Read_buffer、
                            num_read_Bytes、
                            null、
                            null);



我的顺序如下:

int main (空)


   //配置系统频率。
       //
       /*ROM_SysCtlClockSet*/SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz |
                          SYSCTL_OSC_MAIN);

       //
       //初始化 UART。
       //
       ConfigureUART();

       //
       //清除终端并打印欢迎消息。

       //使用前必须启用 I2C3外设。
       //
       /*ROM_SysCtlPeripheralEnable*/SysCtlPeripheralEnable (SYSCTL_Periph_I2C3);
       /*ROM_SysCtlPeripheralEnable*/SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);

       //
       //为端口 D0和 D1上的 I2C3功能配置引脚复用。
       //如果您的器件不支持引脚复用、则无需执行此步骤。
       //
       /*ROM_GPIOPinConfigure*/GPIOPinConfigure (GPIO_PD0_I2C3SCL);
       /*ROM_GPIOPinConfigure*/GPIOPinConfigure (GPIO_PD1_I2C3SDA);

       //
       //为这些引脚选择 I2C 功能。  此函数也会
       //为 I2C 操作配置 GPIO 引脚,将其设置为
       //开漏操作,弱上拉。  请参阅数据表
       //查看每个引脚分配了哪些功能。
       //
       GPIOPinTypeI2CSCL (GPIO_PORTD_BASE、GPIO_PIN_0);
       /*ROM_GPIOPinTypeI2C/GPIOPinTypeI2C (GPIO_PORTD_BASE、GPIO_PIN_1);
       HWREG (GPIO_PORTD_BASE + GPIO_PUR)= 0x3;

       //
       //初始化 LED 的 GPIO
       //
       /*ROM_SysCtlPeripheralEnable*/SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
       /*ROM_GPIOPinTypeGPIOOutput*/GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1);
       /*ROM_GPIOPinWrite*/GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、0x00);

      
       //
       /*ROM_IntMasterEnable*/IntMasterEnable();

       //
       //初始化 I2C3外设。
       //
       I2CMInit (&TFA_sI2CInst、I2C3_base、INT_I2C3、0xff、0xff、
                /*ROM_SysCtlClockGet */SysCtlClockGet ();
 

       I2CMasterInitExpClk (I2C3_base、SysCtlClockGet ()、true/* true*/);//400KBps

然后调用我的函数  


TI_I2C_WriteRead () 类似
TI_I2C_WriteRead (slave_address、
   sizeof (write_data)、write_data、sizeof (read_buffer)、read_buffer);



然而,从 I2C 读取的 SAW 没有重新显示正确的值,此函数是否有用? 如果没有,则可以使用任何其他可能的函数从 I2C 读取/写入缓冲器?

有什么想法吗?

maw、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Maw、
    从何处获取 I2CMRad() API? 它看起来不像 TivaWare I2C API。 您是否有机会查看 TivaWare 库中的一些 I2C 示例? 它们可以为您的开发提供良好的起点。 它们位于中 /examples/peripherals/i2c.
    下面的 I2C 应用手册也是一个带有示例配套资料的很好参考。
    www.ti.com/.../spma073.pdf

    另外、请确保在 SCL 和 SDA 总线上具有适当的上拉电阻器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    我从下面的示例中获得了该函数
    C:\ti\TivaWare_C_Series-2.1.4.178\sensorlib
    有 i2cm_drv.c 和 i2cm_drv.h 文件




    //
    #define I2CM_RMW_State_IDLE 0
    #define I2CM_RMW_State_Read 1
    #define I2CM_RMW_State_WRITE 2.

    //
    //
    //! 将数据写入 I2C 器件。
    //!
    //! \param psInst 是指向 I2C 主设备实例数据的指针。
    //! \param ui8Addr 是要访问的 I2C 器件的地址。
    //! \param pui8Data 是要写入的数据缓冲区的指针。
    //! \param ui16Count 是要写入的字节数。
    //! \param pfnCallback 是写入时要调用的函数
    //! 已完成(如果不需要回调、可以为\b NULL)。
    //! \param pvCallbackData 是传递给回调函数的指针。
    //!
    //! 此函数向要发送的命令队列添加 I2C 写入。 如果
    //! 成功后、使用在后台执行 I2C 写入
    //! 中断处理程序。 写入完成后、回调函数、IF
    //! 在 I2C 主机中断处理程序的上下文中调用。
    //!
    //! 数据缓冲器的第一个字节包含器件到的 I2C 地址
    //! 访问、剩余的\u16Count 字节包含要写入的数据
    //! 连接到器件。 如果没有、则<e ui16Count 参数可以为零
    //! 要写入的字节。
    //!
    //! 如果命令已成功添加到队列中、则返回1、返回0
    //! 如果不是这样。
    //
    //此处的 extern 为该函数提供了一个要处理的非内联定义
    //编译器选择不内联函数(即 A)的情况
    //编译器做出的有效选择)。
    //
    //
    extern uint_fast8_t I2CMWrite (tI2CMInstance * psInst、uint_fast8_t ui8Addr、
    const uint8_t * pui8Data、uint_fast16_t ui16Count、
    tSensorCallback pfnCallback、
    void *pvCallbackData);

    //
    //
    //! 从 I2C 器件读取数据。
    //!
    //! \param psInst 是指向 I2C 主设备实例数据的指针。
    //! \param ui8Addr 是要访问的 I2C 器件的地址。
    //! \param pui8WriteData 是要写入的数据缓冲区的指针。
    //! \param ui16WriteCount 是要写入的字节数。
    //! \param pui8ReadData 是要用读取填充的缓冲区的指针
    //! 数据。
    //! \param ui16ReadCount 是要读取的字节数。
    //! param pfnCallback 是传输时要调用的函数
    //! 已完成(如果不需要回调、可以为\b NULL)。
    //! \param pvCallbackData 是传递给回调函数的指针。
    //!
    //! 此函数向要发送的命令队列添加 I2C 读取。 如果
    //! I2C 读取成功后、将使用在后台执行
    //! 中断处理程序。 当读取完成时、回调函数、IF
    //! 在 I2C 主机中断处理程序的上下文中调用。
    //!
    //! e pui8WriteData 的第一个字节包含器件的 I2C 地址
    //! 要访问、下一个\ui16WriteCount 字节包含要写入的数据
    //! 连接到器件。 从器件读取的数据首先写入
    //! eui16ReadCount 字节的数据。 ui16WriteCount 或
    //! 如果没有要读取的字节或、则 ui16ReadCount 参数可以为零
    //! 书面。 写入字节首先发送到器件、然后再发送读取
    //! 然后从器件中读取字节。
    //!
    //! 如果命令已成功添加到队列中、则返回1、返回0
    //! 如果不是这样。
    //
    //此处的 extern 为该函数提供了一个要处理的非内联定义
    //编译器选择不内联函数(即 A)的情况
    //编译器做出的有效选择)。
    //
    //
    extern uint_fast8_t I2CMRead (tI2CMInstance * psInst、uint_fast8_t ui8Addr、
    const uint8_t * pui8WriteData、
    uint_fast16_t ui16WriteCount、
    uint8_t * pui8ReadData、
    UINT_fast16_t ui16ReadCount、
    tSensorCallback pfnCallback、
    void *pvCallbackData);

    //
    //
    //! 将数据批量写入 I2C 器件。
    //!
    //! \param psInst 是指向 I2C 主设备实例数据的指针。
    //! \param ui8Addr 是要访问的 I2C 器件的地址。
    //! \param pui8Data 是要写入的数据缓冲区的指针。
    //! \param ui16Count 是要写入的字节数。
    //! \param ui16BatchSize 是每个写入批处理中的字节数。
    //! param pfnCallback 是传输时要调用的函数
    //! 已完成(如果不需要回调、可以为\b NULL)。
    //! \param pvCallbackData 是传递给回调函数的指针。
    //!
    //! 此函数向要发送的命令队列添加 I2C 写入。 如果
    //! 成功后、使用在后台执行 I2C 写入
    //! 中断处理程序。 写入完成后、回调函数、IF
    //! 在 I2C 主机中断处理程序的上下文中调用。
    //!
    //! 数据缓冲器的第一个字节包含器件到的 I2C 地址
    //! 访问、剩余的\u16Count 字节包含要写入的数据
    //! 连接到器件。 如果没有、则<e ui16Count 参数可以为零
    //! 要写入的字节。
    //!
    //! 数据以批量方式写入、单位为\e ui16WriteBatchSize。 回调
    //! 函数在写入每个批次后被调用,I2CMTransferResume()
    //! 必须在写入下一个批次时调用。
    //!
    //! 如果命令已成功添加到队列中、则返回1、返回0
    //! 如果不是这样。
    //
    //此处的 extern 为该函数提供了一个要处理的非内联定义
    //编译器选择不内联函数(即 A)的情况
    //编译器做出的有效选择)。
    //


    这里有什么问题吗?

    非常感谢您的建议。

    谢谢
    传感器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Maw、
    抱歉、我没有意识到这是来自 sensorlib 库的。 人们通常使用 TivaWare 外设驱动程序库来实现简单的 I2C 通信。 外设驱动程序库位于中 /driverlib。 使用外设驱动程序库的 I2C 示例可在下找到 /examples/peripherals/i2c. 正如我在上次答复中提到的、I2C 应用手册是使用各种 I2C 外设驱动程序库 API 的好参考。 如果您想使用 sensorlib 库、可以参考第79-82页第8.3节中 TivaWare 传感器库用户指南中列出的示例代码。 传感器库通过多个抽象层实现。 与 TivaWare 外设驱动程序库相比、可能需要更多的精力才能理解。 传感器库用户指南(SW-TM4C-SENSORLIB-UG.2.4.178.pdf)以及所有其他文档可在下找到 /docs。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    破解的员工/I -像您一样、对这个"sensorlib"代码感到"惊讶"!   您是如此正确的-像往常一样增加复杂性-证明了项目完成的"最长路径"-尤其是为了简单地理解!

    使用"kiss"(如您对 PDL 和 API 的(正确)方向所示)、当然、"速度、易用性、增强" 海报的易用性-以及海报成功的可能性...  没有那么多的"sensorlib"(高山(通常)是最后一次攀登(或尝试)-这是有充分理由的。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    我同意。 希望海报将会发现 TivaWare 外设驱动程序库在完成应用时易于使用、更不用说过去有关 I2C 模块的大量论坛帖子了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的所有人:

    非常感谢、我根据 TI I2C 规范植入了自己的驱动程序、并且运行良好。

    此致、

    maw、