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.

[参考译文] CCS/TMDS570LS31HDK:TMDS570LS31HDK、Hercules TMS570LS31x/21x 开发套件

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/959679/ccs-tmds570ls31hdk-tmds570ls31hdk-hercules-tms570ls31x-21x-development-kit

器件型号:TMDS570LS31HDK
主题中讨论的其他器件:TMS570LS3137

工具/软件:Code Composer Studio

我想将 AT24C256与 Hercules TMS570LS31x/21x 开发套件连接、以下代码不起作用:

 /*用户代码开始(0)*/

#include "het.h"
#include "Gio.h"
#include "rti.h"
#include "i2c.h"
/*用户代码结束*/

/*包含文件*/

#include "sys_common.h"

/*用户代码开始(1)*/
/*用户代码结束*/

/**@fn void main (void)
*@应用程序主函数简介
*@请注意、默认情况下、此函数为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*

/*用户代码开始(2)*/
#define Slave_Address 0xA0 // 1 0 1 0 0 A1 A0 R/W
uint8_t TX_Data[4]={0x00、0x00、0xAA、0x55};    //前两个字节为字地址、然后两个字节为数据
/*用户代码结束*/

int main (空)

/*用户代码开始(3)*/

i2cInit();

i2cSetSlaveAdd (i2cREG1、Slave_Address);

i2cSetDirection (i2cREG1、I2C_transmitter);

i2cSetCount (i2cREG1、4);

i2cSetMode (i2cREG1、I2C_MASTER);

i2cSetStop (i2cREG1);

i2cSetStart (i2cREG1);

i2cSend (i2cREG1、4、TX_Data);

while (i2cIsBusy (i2cREG1)=true);

while (i2cIsStopDetected (i2cREG1)=0);

i2cClearSCD (i2cREG1);

while (1);

/*用户代码结束*/

 

控制器正在 i2cSend()函数中等待,如下所示:

void i2cSend (i2cBASE-t * i2c、uint32长度、uint8 *数据)

/*用户代码开始(17)*/
/*用户代码结束*/

if ((g_i2cTransfer_t.mode &(uint32) I2C_TX_INT)!= 0U)

/*中断模式*/
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
g_i2c 传输_t.data =数据;
/*通过发送第一个字节开始传输*/
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
I2C->DXR =(uint32)(*g_i2cTransfer_t.data);
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
g_i2c 传输_t.data++;

/*长度-1、因为一个数据已被写入*/
g_i2cTransfer_t.length =(长度- 1U);

/*启用发送中断*/
I2C->IMR |=(uint32) I2C_TX_INT;

其他

/*发送数据*/
while (长度> 0U)

/*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
while (((i2c->STR &(UINT32) I2C_TX_INT)== 0U)             <<<---- --控制器正在等待此处

}/*等待*/
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
I2C->DXR =(UINT32)(*DATA);
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
Data++;
长度--;


/*用户代码开始(18)*/
/*用户代码结束*/

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

    我想使用 GIOA[0]-[7]、GIOB[0]-[7]、DMMDATA[0]-[15]、RTP_DATA[0]-[15]、CANxxx、 LINRX、LINTX 这些引脚作为正常用途 GPIO、请提供我的示例代码(软件功能)

    例如: gioSetDirection (hetPORT1,0xFFFFFFFF);

                gioSetBit (hetPORT1、0、1);

                gioSetBit (hetPORT1、17、1);

                gioSetBit (hetPORT1、18、1);

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

    您好!

    我不熟悉 AT24C256。 从该器件读取数据时、是否需要先发送字地址?

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

    您好!

    DMMDATA[0]-[15]、RTP_DATA[0]-[15]、LINRX、LINTX 可用作 GIO 引脚、并且 GIO API 可用于配置这些 GIO 引脚。  

    CAN_RX 和 CAN_TX 引脚也可用作 GIO 引脚。  此功能由 CAN TX IO 控制寄存器控制。 只有当 CAN 控制寄存器的 Init 位被置位时、IO 控制寄存器的值才可写入。 此处无法使用 GIO API。

     

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

    告诉"我不熟悉 AT24C256。 当您从此设备读取数据时、是否需要先发送字地址?" 我的问题未得到解决。

    请尝试了解我面临的问题的位置以及解决该问题的方法是什么?

    我的工作因您的回复而延迟、请尽快解决此问题。  

    我再次请求您提供从 AT24C256 EEPROM 发送和接收数据的正确步骤。

    以下是 AT24C256数据格式的屏幕截图、为便于您更好地理解和查看上述代码、我不知道控制器为何在等待

    " while ((i2c->STR &(UINT32) I2C_TX_INT)=0U){"  

    我已经使用带或不带连接 EEPROM 的 DSO 检查了控制器的 SCL 和 SDA 引脚、但仍然没有获得任何信号。

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

    我想将 GIOA 用作输出端口、我应该在以下函数中写入什么内容?

    void gioSetDirection (gioPORT_t *端口、uint32目录)

    我应该用什么代替*port?

    由于 GIOA 仅为8位、dir 为32位、dir 的值应该是多少?

    请尽快回复我。  

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

    您好、Rahul、

    从图中可以看到 Slave_Address 是0x50、而不是0xA0。  I2CSAR 寄存器中的 Salve 地址不包括 R/W 位。  

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

    我已经尝试使用从地址0x50、但仍然无法正常工作。

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

    正在等待您的回复?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    gioSetDirection (gioPORTA,……)
    gioSetDirection (gioPORTB,……)
    gioSetDirection (hetPORT1,...)
    GIODIR 寄存器为32位。 写入被改进的位字段无效、位0用于 GIO[0]、位1用于 GIO[1]、……
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请仔细检查引脚多路复用器是否设置正确。 I2C 引脚(B2、C3)与 MibSPI CSx 和 N2HET 引脚复用。

    调用 i2cSetStart (i2cREG1)后、探测 I2C 总线以检查 I2C 从地址是否已发送且 ACK 位为低电平(已确认)

    3.如果是,请逐字节发送地址为92字节的字,以确保 I2C 从设备的响应正确。

    AT24C 支持字节写入和页写入(64字节)。 您能否先尝试字节写入而不是部分页写入?

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

    我想将 DMMDATA[0]-[15]和 RTP_DATA[0]-[15] 用作 IO 端口、我应该在以下函数中写入什么?

    void gioSetDirection (gioPORT_t *端口、uint32目录)

    我应该用什么代替*port?

    为我提供相同的 API。

    请尽快回复我。  

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

    您能否对 DMM IO 问题使用单独的帖子、并将此主题仅保留为 I2C 问题? 谢谢

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

    我已经尝试使用从地址0x50、但 I2C 仍然没有响应...

    我的工作正在等待中。 我正在等待您的回复?

    我要怎么做?

    我的代码在这里等待--> while ((i2c->STR &(UINT32) I2C_TX_INT)== 0U)
                            {
                            }/*等待*/

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

    我已经检查了引脚多路复用、它是正确的。 我已经检查了 DSO 上的 SDA 和 SCL、这两条线路都只为高电平。 这些引脚上没有任何信号。

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

    当代码卡住时、长度的值是多少?  

    您能否单独发送2字节字地址和2字节数据?  

    发送器件地址和字地址后、您是否获得了正确的 ACK?  

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

    问:代码何时卡住?

    答: 我的代码卡在这里--> while ((i2c->STR &(UINT32) I2C_TX_INT)== 0U)
                                   {
                                   }/*等待*/

    问:长度的值是什么?  

    答:4.

    问: 您能否单独发送2字节字地址和2字节数据?  

    答:我尝试过这种方法,但没有工作。  i2cSend (i2cREG1、2、TX_Word_Addr);

      i2cSend (i2cREG1、2、TX_Data);

    问: 发送器件地址和字地址后、您是否获得了正确的 ACK?  

    答:当我使用 DSO 进行检查时、两个引脚都处于高电平、不会获取任何 cock 和数据、甚至不会在 SDA 引脚上获取任何从器件地址。

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

    您好!

    串行时钟线(SCL)和串行数据线(SDA)通过外部上拉电阻器被拉高、因此当没有数据被发送时、两条线路处于高电平。

    协议包含一个开始位、地址位、读取/写入(R/W)位、数据字节、确认位(ACK)、 无应答位(NACK)、停止位和重新启动位(相当于不带停止位的起始位)。

    主器件始终发送起始位(S)来启动通信。 它被定义为在 SCL 被保持在高电平时 SDA 线上从高到低的转换。 您是否在示波器上看到了起始位?

    确认位(ACK)出现在第九个 SCL 时钟脉冲上。 它由接收器件发送、同时将 SDA 线路拉至低电平。 当接收器件未能将 SDA 线路拉至低电平时、发送无应答位。 当 NACK 被接收时、传输被中止。 主机始终发送 STOP 位来结束通信。 它被定义为在 SCL 线路被保持在高电平时 SDA 线路上的低电平到高电平转换。 因此、在主器件发送器件地址后、器件应将 ACK 发送回主器件。

    从消息中、您看不到 SCL 总线上的任何时钟信号。 传输不是 stared。  

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

    问:您是否在示波器上看到了起始位?

    答:我之前已经告诉过您、SDA 和 SCL 引脚上没有任何信号、两条线路都是高电平。

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

    如果引脚多路复用器配置正确、 无论 I2C 器件是否连接、当 i2cSetStart (i2cREG1)被执行时、您应该会在 SDA 总线上看到起始位和从地址。

    请仔细检查焊球 B2和 C3的引脚多路复用器配置  

    2.仔细检查电线连接,确保 B2连接到 I2C 器件的 SDA,C3连接到 I2C 器件的 SCL

    3.在 I2C 配置窗口(I2C 端口)中、确保 I2C 信号未配置为 GIO  

    以下是我的 I2C 环回测试、其自身地址为0x75:

    执行 i2cSetStart (i2cREG1)后:可以看到起始位、从器件地址(0x75)、R/W 和 ACK 位

      

    在传输1个字节的数据后:您可以看到起始位、从器件地址、R/W、ACK、1字节数据、 和 ACK。

      

    这是我的测试代码:

    /*包含文件*/

    #include "sys_common.h"

    /*用户代码开始(1)*/
    #include "system.h"
    #include "i2c.h"

    /*用户代码结束*/

    /**@fn void main (void)
    *@应用程序主函数简介
    *@请注意、默认情况下、此函数为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    *

    /*用户代码开始(2)*/
    #define LOAD_ADD 0x75
    #define SLV_add 0x5A
    #define bsize 8.

    uint8 TX_PACK[16]={0x5A、0x5B、0x5C、0x5D、0x5E、0x5F、0x5A、0x5B、0x5C、0x5D、0x5C、0x5F、0x5A、0x5B、0x5E、0x5D};
    UINT8 RX_PACK[16]={0};
    uint32数据;

    void i2cEnableLoopback (i2cBASE-t * i2c);
    /*用户代码结束*/

    int main (空)

    /*用户代码开始(3)*/
    uint32 buf_size = bsize、i、errNum;
    uint8 * t_buff =&TX_Pack[0];
    uint8 * r_buff =&RX_Pack[0];

    /* i2c 初始化*/
    i2cInit();

    /*设置 i2c 自有地址*/
    i2cSetOwnAdd (i2cREG1、Own_add);

    /*启用内部回送*/
    i2cEnableLoopback (i2cREG1);

    /*启动传输的启动条件*/
    i2cSetStart (i2cREG1);

    /*发送数据包*/
    while (buf_size--)

    i2cSendByte (i2cREG1、* t_buy++);
    /*接收数据包*/
    *r_buff ++= i2cReceiveByte (i2cREG1);

    asm (" nop");//用于断点

    errNum = 0;
    (i=0;<bsize; i++){
    如果(RX_PACK[i]!= RX_PACK[i])
    errNum++;

    /*清除停止条件检测标志*/
    i2cClearSCD (i2cREG1);


    while (1){};//在 TX-Rx 完成后永远等待。 *
    /*用户代码结束*/

    返回0;

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

    有关引脚多路复用器和 I2C 协议的更多信息、请阅读 TMS570LS3137数据表和 TRM。 谢谢

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

    我已经测试过上述环回代码、运行正常。

    但我想将 EEPROM (AT24C256)与该板连接。

    我的代码无法正常工作:

    /*包含文件*/

    #include "sys_common.h"

    /*用户代码开始(1)*/

    #include "system.h"
    #include "i2c.h"


    /*用户代码结束*/

    /**@fn void main (void)
    *@应用程序主函数简介
    *@请注意、默认情况下、此函数为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    *

    /*用户代码开始(2)*/

    #define Slave_Address 0x50  
    uint8_t TX_Data[4]={0x00、0x00、0xAA、0x55};
    uint8_t RX_Data[2]={0};

    /*用户代码结束*/

    int main (空)

    /*用户代码开始(3)*/

    i2cInit();

    i2cSetSlaveAdd (i2cREG1、Slave_Address);  

    i2cSetDirection (i2cREG1、I2C_transmitter);

    i2cSetCount (i2cREG1、4);  

    i2cSetMode (i2cREG1、I2C_MASTER);  

    i2cSetStop (i2cREG1);  

    i2cSetStart (i2cREG1);  

    i2cSend (i2cREG1、4、TX_Data);  

    while (i2cIsBusy (i2cREG1)=true);

    while (i2cIsStopDetected (i2cREG1)=0);

    i2cClearSCD (i2cREG1);  

    while (1);

    /*用户代码结束*/

    我的代码正在 i2cSend (i2cBASE-t * i2c、uint32 length、uint8 * data)函数中等待  

    while (((i2c->STR &(UINT32) I2C_TX_INT)== 0U)              <<<<<<----   在这里等候

    }/*等待*/

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

    如果回送正常、 代码中的 i2cSetStart (i2cREG1)应生成时钟、起始位并发送 I2C 器件地址。 但您说过您在 SCL 和 SDA 线路上看不到信号。 您需要弄清楚 I2C 总线上为什么没有信号。   

    强上拉电阻(小电阻)可防止 I2C 引脚驱动为低电平。 因此、请仔细检查您的上拉电阻和导线连接。  

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

    在代码卡入  while ((i2c->STR &(uint32) I2C_TX_INT)== 0U)之前、我捕获了两个屏幕截图               <<<<<<----   在这里等候
                                                        {
                                                        }/*等待*/


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

    我们已在开发套件中使用上述代码进行了测试、并找到了随此链接附带的不同波形。 请向我们提供 进一步的意见以解决该问题。

    调用 i2cSetStart()后的波形;

      

    FIRST_BYTE 数据传输后的波形

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

    当 FREE 位(I2CMDR.14)被设定为1时、I2C 模块可被置于自由运行模式。 当您使用断点调试软件时、将使用自由运行模式。

    i2cREG1->MDR |= (uint32)((uint32) 1U <<14U);   //自由运行*/

    这就是为什么在您的第一个屏幕截图中只捕获一个脉冲、您的断点会在  i2cSetStart (i2cREG1)的下一条指令中添加。

    请添加  

    i2cREG1->MDR |= (uint32)((uint32) 1U <<14U);   //自由运行*/

    在 i2cInit()之后,捕获 I2C 波形:

    i2cSetStart (i2cREG1); --检查从器件地址、R/W、ACK

    2. i2cSend (..):--检查字地址、ACK 和数据、ACK

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

    我已经附加了 I2C 通信的主文件、它在放置断点或保持连续读取和写入调用之间的延迟时工作正常。 但是,如果没有这些断点或延迟,代码就会保留在 i2cSend()  -->  while (i2c->STR &(uint32)I2C_TX_INT)== 0U)内。  
    请帮助我们解决此问题。

    请查找 我们 的代码参考附件。

    SYS_MAIN.c

    /*包含文件*/

    #include "sys_common.h"

    /*用户代码开始(1)*/
    #include "i2c.h"
    #include "at24c256.h"
    /*用户代码结束*/

    /**@fn void main (void)
    *@应用程序主函数简介
    *@请注意、默认情况下、此函数为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    *

    /*用户代码开始(2)*/
    extern void EEPROM_WRITE_object (uint16_t byte_addr、void * obj_p、uint16_t obj_size);
    extern void EEPROM_read_object (uint16_t byte_addr、void * obj_p、uint16_t obj_size);
    空等待(uint32时间);


    uint8_t Tx_Data[10]={0x45、0x19、0xA1、0xA2、0x25、 0xA4、0xA5、0xA6、0xB5、0x12};
    uint8_t Rx_Data[10]={0};

    /*用户代码结束*/

    int main (空)

    /*用户代码开始(3)*/

    i2cInit();

    EEPROM_WRITE_object (0x0001、Tx_Data、10);

    EEPROM_READ_object (0x0001、RX_Data、10);

    EEPROM_WRITE_object (0x0010、Tx_Data、10);

    EEPROM_READ_object (0x0010、Rx_Data、10);

    asm (" nop");

    while (1);

    /*用户代码结束*/


    at24c256.c

    /**
    秘书长的报告
    *@文件 at24c256.c
    *@作者 Rahul
    *@简要此文件包含 EEPROM (AT24C256)的读/写功能。
    秘书长的报告
    *

    /*包括------------------------------------------ *
    #include "at24c256.h"
    #include "i2c.h"

    /**@addtogroup
    *@{
    *

    /**@defgroup
    *@简介
    *@{
    *

    /*外部变量------------------------------------------------------- *
    /*私人 typedef ------------------------------------------------------- *
    /*私有定义------------------------------------------------------- *
    #define SLAVE_ADDRESS 0x50

    /*私有宏------------------------------------------------------- *
    /*私有变量------------------------------------------------------- *
    /*私有函数原型------------------------------------------------------- *
    /*私有函数------------------------------------------------------- *


    /**
    *@简述此函数用于将数据写入 EEPROM
    *@param byte_addr:字节地址;* obj_p:指向数据的指针;obj_size:数据大小
    *@Retval 无
    *
    void EEPROM_WRITE_object (uint16_t byte_addr、void * obj_p、uint16_t obj_size)

    uint8_t word_addr[2]、* tx_data = obj_p;

    memcpy (word_addr、(const void *)&byte_addr、sizeof (word_addr));

    i2cSetSlaveAdd (i2cREG1、SLAVE_ADDRESS);//配置从机的地址以与*/通信

    i2cSetDirection (i2cREG1、I2C_transmitter);//将方向设置为发送器*/

    i2cSetCount (i2cREG1、obj_size + sizeof (word_addr));//配置数据计数

    i2cSetMode (i2cREG1、I2C_MASTER);//将模式设置为 Master *

    i2cSetStop (i2cREG1);//设置编程计数后的停止*

    i2cSetStart (i2cREG1);//发送开始条件*/

    i2cSend (i2cREG1、sizeof (word_addr)、word_addr);//发送字地址*

    i2cSend (i2cREG1、obj_size、TX_data);//发送数据*

    while (i2cIsBusy (i2cREG1)== true);//等待总线忙被清除*/

    while (i2cIsStopDetected (i2cREG1)=0);//等待直到检测到停止*

    i2cClearSCD (i2cREG1);//清除停止条件*/

    /**
    *@简述此函数用于从 EEPROM 读取数据
    *@param byte_addr:字节地址;* obj_p:指向数据的指针;obj_size:数据大小
    *@Retval 无
    *
    void EEPROM_READ_object (uint16_t byte_addr、void * obj_p、uint16_t obj_size)

    uint8_t word_addr[2]、* rx_data = obj_p;

    memcpy (word_addr、(const void *)&byte_addr、sizeof (word_addr));

    while (i2cIsMasterReady (i2cREG1)!= true);//等待直到 MST 位被清除,这在总线忙线被清除后需要几个周期*/

    i2cSetSlaveAdd (i2cREG1、SLAVE_ADDRESS);//配置从机的地址以与*/通信

    i2cSetDirection (i2cREG1、I2C_transmitter);//将方向设置为发送器*/

    i2cSetCount (i2cREG1、sizeof (word_addr));//配置数据计数*

    i2cSetMode (i2cREG1、I2C_MASTER);//将模式设置为 Master *

    i2cSetStop (i2cREG1);//设置编程计数后的停止*

    i2cSetStart (i2cREG1);//发送开始条件*/

    i2cSend (i2cREG1、sizeof (word_addr)、word_addr);//发送字地址*/

    while (i2cIsBusy (i2cREG1)== true);//等待总线忙被清除*/

    while (i2cIsStopDetected (i2cREG1)=0);//等待直到检测到停止*

    i2cClearSCD (i2cREG1);//清除停止条件*/

    while (i2cIsMasterReady (i2cREG1)!= true);//等待直到 MST 位被清除,这在总线忙线被清除后需要几个周期*/

    i2cSetSlaveAdd (i2cREG1、SLAVE_ADDRESS);//配置从机的地址以与*/通信

    i2cSetDirection (i2cREG1、I2C_RECEIVER);//将方向设置为接收器*/

    i2cSetCount (i2cREG1、obj_size);//配置数据计数*

    i2cSetMode (i2cREG1、I2C_MASTER);//将模式设置为 Master *

    i2cSetStop (i2cREG1);//设置编程计数后的停止*

    i2cSetStart (i2cREG1);//发送开始条件*/

    i2cReceive (i2cREG1、obj_size、rx_data);//发送数据*

    while (i2cIsBusy (i2cREG1)== true);//等待总线忙被清除*/

    while (i2cIsStopDetected (i2cREG1)=0);//等待直到检测到停止*

    i2cClearSCD (i2cREG1);//清除停止条件*/

    /**** 文件结尾 /

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

    您好!

    读取和写入函数都会检查停止位,因此代码对我来说看起来很好。 您是不是指在 main()中的每个函数调用之间添加延迟? 需要多少个周期?

    EEPROM_WRITE_object (0x0001、Tx_Data、10);

    delay() --- 多少个周期?

    EEPROM_READ_object (0x0001、RX_Data、10);

    延迟()

    EEPROM_WRITE_object (0x0010、Tx_Data、10);

    延迟()

    EEPROM_READ_object (0x0010、Rx_Data、10);

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

    我们尝试了3ms 的延迟、它工作正常。

    是否可以毫不延迟地执行相同的代码?

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

    I2C 主设备侧(TMS570)没有限制。 请查看 EEPROM 的数据表、以查看其是否具有此要求。  

    无延迟、I2C 主器件是否正确生成起始位并发送从器件地址?