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/TMS320F28027:I2C EEPROM 读取

Guru**** 2540720 points
Other Parts Discussed in Thread: MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/691286/ccs-tms320f28027-i2c-eeprom-read

器件型号:TMS320F28027
主题中讨论的其他器件:MOTORWARE

工具/软件:Code Composer Studio

你好

美好的一天!

我正在使用 F28027F、并尝试通过 I2C 接口将数据存储到 EEPROM (Atmel 24C04)中

C:\ti\motorware_1_01_00_16\sw\solutions\instaspin_foc\boards\hvkit_rev1p1\F28x\f2802xF\projects\ccs5\example_F2802xI2C_EEPROM_Example_2802xI2C_EEPROM.c

很高兴它运行得相当好,但我有一些问题。

  1. 我需要的是、将32位(浮点)数据存储到 EEPROM 中、这可以是这样的

 

地址

数据

0x0000

0x23

0x0001

0x54

0x0002

0x42

0x0003

0x26

0x0004

0x34

0x0005

0x76

0x0006

0x56

0x0007

0x45

 

如表中所示、0x0000 -0x0003属于一个32位浮点数据、而0x0004-0x0007属于另一个32位浮点数据、等等…

怎么做?

2.注意此代码。

#define I2C_SLAVE_ADDR 0x50
#define I2C_NUMBYTES 2
#define I2C_EEPROM_HIGH_ADDR 0x00
#define I2C_EEPROM_LOW_ADDR 0x30

//全局变量
//传出地址将使用两个字节,
//因此仅设置最大
14字节结构 I2CI2cMsgOut1={I2C_MSG_SEND_WITHSTOP,
I2C_SLAVE_ADDR、
I2C_NUMBYTES、
I2C_EEPROM_HIGH_ADDR、
I2C_EEPROM_LOW_ADDR、
0x10、//消息字节1
0x20 //消息字节2
};

struct I2CMSG I2cMsgIn1={I2C_MSGSTAT_SEND_NOSTOP、
I2C_SLAVE_ADDR、
I2C_NUMBYTES、
I2C_EEPROM_HIGH_ADDR、
I2C_EEPROM_LOW_ADDR 
};


A.这些(#define I2C_EEPROM_HIGH_ADDR 0x00和#define I2C_EEPROM_LOW_ADDR 0x30)是否为 EEPROM 地址?
如果是、那么为什么(I2C_EEPROM_LOW_ADDR 0x30)没有从0x00开始?!
如果您能更详细地解释2C_EEPROM_HIGH_ADDR 和 I2C_EEPROM_LOW_ADDR,我会很高兴。

b.我对该项目中的评论有点困惑。(
"传出地址将使用两个字节、因此最多只设置14个字节)"这是什么意思?

如果我将 I2C_NUMBYTES 设置为大于2、我还必须将#define I2C_MAX_BUFFER_SIZE 设置为大于4
这又造成了另一个问题... 请看下面的代码。


// I2C 消息结构
结构 I2CMSG{
uint16 MsgStatus; //字说明 msg 处于什么状态:
// I2C_MSGCMD_INACTIVE =不发送消息
// I2C_MSGCMD_BUSY =已发送 msg start,
// 等待停止
// I2C_MSGCMD_SEND_WITHSTOP =要发送的命令
// 主器件传输消息完成、带有一个停止位
// I2C_MSGCMD_SEND_NOSTOP =要发送的命令
// 不带停止位的主器件传输消息
// I2C_MSGCMD_RESTART =发送重启的命令
// 作为具有停止位
UINT16 SlaveAddress 的主接收器; //从器件消息的 I2C 地址用于
uint16 NumberOfBytes; //
uint16 memoryHighAddr 中(或将放置在 MsgBuffer 中)的有效字节数量; //与 msg (高字节)
关联的数据的 EEPROM 地址 uint16 memoryLowAddr; //与 msg (低字节)
关联的数据的 EEPROM 地址 uint16 MsgBuffer[I2C_MAX_Buffer_SIZE];//阵列保存 msg 数据-最大值
//由于、MAX_BUFFER_SIZE 可以是4
// FIFO
的}; 

正如您看到的、I2C_MAX_BUFFER_SIZE 不能设置为超过4...

uint16 MsgBuffer[I2C_MAX_Buffer_SIZE];//阵列保存 msg 数据-最大值
//由于、MAX_BUFFER_SIZE 可以是4
// FIFO

请告诉我如何 逐字节存储 EEPROM?

它是否需要 按顺序(Getdata (Address = 0x0000.0x0001.0x0002.0x0003、...0xFFFF) 对 EEPROM 进行寻址、或者我们可以随机进行寻址(我需要随机寻址)?

感谢您的关注。

此致。

Dave。

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

    Dave、

    我希望 我已经回答了您的以下问题

    答:这可能是示例创建者选择显示地址访问而不仅仅是从0开始地址的选择。 您可以将写入的起始地址更改为所需的任何地址。 该示例提供了寻址16位地址 I2C 的选项。 在本例中、_HIGH_ADDR 是地址的高8位。

    B.这看起来像是来自其他器件的一个进位、其中包含一个16字节深 FIFO。 在 F2802x 上、只有一个4字节深的 FIFO。 后面的注释是正确的注释。  

    如果需要存储/读取2个以上的数据字节、则需要修改示例。 这可能包括在字地址写入器件后添加另一个写入非连续数据的状态、然后继续在另一个状态下写入数据负载。  

    本质上、该示例执行随机存取顺序读取。 首先写入数据地址、然后进行2字节顺序读取。 更改要读取的地址和数据长度、并且可以从 EEPROM 上的任何地址随机进行顺序读取。

    谢谢、
    标记

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

    尊敬的 Mark
    感谢您的评论。
    我不知道"在 F2802x 上、只有一个4字节深的 FIFO。" 很有趣!

    您确定 EEPROM 中存储器地址的两个常量(I2C_EEPROM_HIGH_ADDR 和 I2C_EEPROM_LOW_ADDR)吗?
    由于我在0x0030存储器地址中写入两个字节(Data=0x10,Data=0x20),在0x0032存储器地址中写入两个字节(Data=0x30,Data=0x40)进行测试,然后我读取 EEPROM (I2C_EEPROM_HIGH_ADDR 和 I2C_EEPROM_LOW_ADDR = 0x0030存储器地址),我得到的内容是(Data=0x30!! 我还读取 EEPROM (I2C_EEPROM_HIGH_ADDR 和 I2C_EEPROM_LOW_ADDR = 0x0032存储器地址)我在每个存储器地址中得到的值是(Data=0x30、Data=0x40)我得到的值是相同的!!!!

     问题2例如0x0030的单个存储器地址如何存储两个字节、

    它有这样的东西吗,我对吗?  

    存储器地址 数据
    0x0030 0x10
    0x0031 0x20

    此致

    Dave。

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

    我确定、只是验证了它。

    我在 EEPROM 上编程了几个不同的位置。 在地址0x30 -> 0x42处、我将地址编程为数据。 然后、我跳转到另一个存储器地址(而不是数据=地址)、结果按预期返回。

    在设置测试运行时要小心。 如果只在示例开头修改#定义、则结果将始终读回、正如示例所做的那样。

    谢谢、

    标记

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mark
    感谢您的即时回复:)。

    问题2例如0x0030的单个存储器地址如何存储两个字节、

    它有这样的东西吗,我对吗?

    存储器地址数据
    0x00300x10
    0x00310x20

    此致

    Dave。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    每个存储器地址仅存储一个字节。 您的表正确。 EEPROM 具有顺序读取和写入函数、该示例利用了这些函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的标记:)。
    祝你一切顺利。
    Dave。