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/TMS320F28377D:使用 I2C 模块将 EEPROM Microchip 24FC64与 F28377D 连接时、我遇到一些行为问题

Guru**** 2611705 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/690931/ccs-tms320f28377d-i-have-some-behavioral-issue-while-use-i2c-module-to-interfacing-eeprom-microchip-24fc64-with-f28377d

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

早上好。

我配置了 I2C 模块设置 GPIO (有外部上拉电阻器)并执行以下初始化:

void I2CB_Init (void)
{
//初始化 I2C GPIO
I2CB_Init_GPIO ();

//初始化 I2C-B 模块
I2cbRegs.I2CMDR.bit.IRS = 0; // DB -重置 I2C 模块以进行设置[TMR 页 2034]
I2cbRegs.I2CSAR.ALL = 0x0000; //从地址

//预分频器-模块时钟需要7-12MHz
//
I2cbRegs.I2CPSC.all = 27; // DB - PERx.SYSCLK/(IPSC+1)= 7.14MHz @200MHz [ TMR 页 2034 7-12MHz 正常]
I2cbRegs.I2CCLKL = 8; //注:必须为非零
I2cbRegs.I2CCLKH=7; //注:必须为非零
// T=1/7.14MHz*[(ICLKL+d)+(ICLKH+d)]= 3、5us @ 286kbps @ d=5 - IPSC > 1 [ TMR 页。 2035]
// I2cbRegs.I2CIER.all = 0x24; //启用 SCD 和 ARDY __interrupts
*//
T = 1/11.76MHz*[(ICLKL+d)+(ICLKH+d)]= 5、014us @ 199、4kbps @ d = 5 - IPSC > 1
I2cbRegs.I2CPSC.all = 16; // DB - PERx.SYSCLK/(IPSC+1)= 11.76MHz @200MHz [ TMR 页 2034 7-12MHz 正常]
I2cbRegs.I2CCLKL = 19; //注:必须为非零
I2cbRegs.I2CCLKH = 30; //注:必须为非零

I2cbRegs.I2CIER.ALL = 0x0000; //不启用中断

I2cbRegs.I2CMDR.bit.XA = 0; // DB - 7位地址
I2cbRegs.I2CMDR.bit.FDF = 0; // DB -无自由数据格式
// I2cbRegs.I2COAR.bit.OAR = 1; // DB -从机模式中的所有者地址
// I2cbRegs.I2CSAR.bit.SAR = 1; // DB -主控模式中的从器件地址
I2cbRegs.I2CMDR.bit.DLB = 0; // DB -禁用环回模式
I2cbRegs.I2CMDR.bit.FREE = 1; // DB -自由模式
I2cbRegs.I2CMDR.bit.MST = 1; // DB -主模式

I2cbRegs.I2CFFTX.bit.TXFFRST = 0;// BB -复位 TX FIFO
I2cbRegs.I2CFFTX.bit.I2CFFEN = 1;// DB -设置 Tx FIFO 模式
I2cbRegs.I2CFFTX.bit.TXFFIL = 15;// DB - Tx FIFO 电平
I2cbRegs.I2CFFTX.bit.TXFFRST = 1;// DB -禁用 Tx FIFO
I2cbRegs.I2CFFTX.bit.TXFFIENA=0;// DB -禁用 TX FIFO 中断
I2cbRegs.I2CFFTX.bit.TXFFRST = 1;// BB -释放复位 TX FIFO

I2cbRegs.I2CFFRX.bit.RXFFRST = 0;// BB -复位 RX FIFO
I2cbRegs.I2CFFRX.bit.RXFFIL = 15;// DB - Rx FIFO 电平
I2cbRegs.I2CFFRX.bit.RXFFINTCLR = 1;// DB -清除 FFIntFlag
I2cbRegs.I2CFFRX.bit.RXFFRST = 1;// DB -禁用 Rx FIFO
I2cbRegs.I2CFFRX.bit.RXFFIENA=0;// DB -禁用 RX FIFO 中断
I2cbRegs.I2CFFRX.bit.RXFFRST = 1;// BB -释放复位 RX FIFO

I2cbRegs.I2CMDR.bit.IRS = 1; // DB -重新复位到 I2C 模块
} 

遗憾的是、我尝试修改 I2C 的速度以解决我想要解释的问题(请参阅两种速度配置)、该问题受支持

范围。 我执行的第一个操作是执行以下函数:

I2CB_EE_write16 ((unsigned int)(ptR_measure_begin +(ptR_abs_time_H * 2))、(unsigned int) 0x1111);

其中定义为:

unsigned int I2CB_EE_write16 (unsigned int EE_addr、unsigned int data_Byte)
{
unsigned int I2C_error;

I2C_ERROR = I2CB_EE_write8 (EE_addr、(DATA_BYTE 和0x00FF);

DELAY_US (500L);//延迟以最小化

I2C_ERROR = I2CB_EE_write8 (EE_addr + 1、(DATA_BYTE & 0xFF00)>> 8);

DELAY_US (500L);//延迟以最小化

返回1;
} 

当然、我希望及时执行两个8位 EE 文章。 这个8位 EE 写入函数是:

unsigned int I2CB_EE_write8 (unsigned int EE_addr、unsigned int data_Byte)
{
#define RESET_I2C_TIMEOUT 0x0FFF

unsigned int I2C_ERROR、I2C_TIMEOUT;

//禁用写保护线
GpioDataRegs.GPCCLEAR.bit.GPIO82=1;

//等待直到 STP 位从任何先前的主设备通信中清零。
//模块清除该位的操作被延迟到 SCD 位之后
//设置。 如果在启动新消息之前未选中此位
// I2C 可能会被混淆。
//
I2C_TIMEOUT = RESET_I2C_TIMEOUT;
while (I2cbRegs.I2CMDR.bit.STP &&(I2C_TIMEOUT > 0))
I2C_TIMEOUT--;

if (I2C_TIMEOUT = 0)
返回 I2C_BUS_BUS_BUSY_ERROR;

//设置从地址
I2cbRegs.I2CSAR.all = EEPROM_I2C_ADDRESS;

//检查总线是否占线
I2C_TIMEOUT = RESET_I2C_TIMEOUT;
while (I2cbRegs.I2CSTR.bit.bb &&(I2C_TIMEOUT > 0))
I2C_TIMEOUT--;

if (I2C_TIMEOUT = 0)
返回 I2C_BUS_BUS_BUSY_ERROR;

//设置要发送的字节数
//控制字节+地址 H & L
I2cbRegs.I2CCNT = 3;

//设置要发送的数据
I2cbRegs.I2CDXR.ALL =((EE_addr >> 8)& 0x00FF);
I2cbRegs.I2CDXR.All =(EE_addr & 0x00FF);
I2cbRegs.I2CDXR.ALL = DATA_BYTE;

//将 START 作为带有 STOP 的主发送器发送
I2cbRegs.I2CMDR.ALL = 0xEE20;
// DB - NACKMOD[15]= X ->在从器件中生成 ACK [X if in TX Mode]
// DB - free[14]= 1 ->在断点上自由运行
// DB - STT[13] = 1 ->在主模式下生成 START
// DB -保留= 0

// DB - STP[11] = 1 ->停止由模块生成
// DB - MST[10] = 1 ->主机模式被启用
// DB - TRX[9] = 1 -> Tx 模式被启用
// DB - XA[8] = 0 -> 7位地址

// DB - Rm[7] = 0 ->无重复模式
// DB - DLB[6] = 0 ->环回模式
// DB - IRS[5] = 1 -> I2C 模块被启用
// DB - STB[4] = 0 ->无起始字节

// DB - FDF[3] = 0 ->无自由数据模式;
// DB - BC[2-0] = 000 -> 8位;

//激活写保护行
DELAY_US (300);
GpioDataRegs.GPCSET.BIT.GPIO82=1;

返回1;
} 

如果我在两个 I2CB_EE_write8按顺序执行时执行 I2CB_EE_write16、我会注意到、在执行第二个写入操作后、

I2C 总线未释放。 如果我执行一次断点一个 I2CB_EE_write8、EE 写入过程将正确执行。 我也是如此

认为代码是正确的、但出于同样的异步原因、存在会阻止第二次后时钟 I2C 模块生成的 someings

写入操作:I2C 总线保持低电平、尽管我执行了它希望在发送3后生成停止条件的同一 I2CMDR 字

字节(请参阅示波器:两个相对的一个单独的著作和一个 togheter);不幸的是、在第二个写入中、只有控制字节退出...

希望您能为您提供帮助。

此致。

迭戈·贝拉希马  

P.S.:请遵循示波器。

两篇8b EE 文章 togheter [isse].bmp

第1个8b EE 写入[I2C 总线已释放].bmp

2ST 8b EE 写入[I2C 总线已释放].bmp

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

    为什么要启用 I2CMDR.NACKMOD 位? 该位需要置位、以便在主接收器模式(或)从接收模式下提供 NACK。 您在 I2C 写入函数中充当主发送器。/

    您可以在 I2CB_EE_write8函数中尝试 I2cbRegs.I2CMDR.all = 0x6E20吗? 这将禁用 NACKMOD 位。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此问题是否已解决? 我没有听到您的反馈。

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

    您好、Manoj。

    不幸的是,我只是试了很多次,也是你们的建议,没有成功。 现在、我将写入 EEPROM 例程的延迟保持在固定的状态、以等待写入结束。 我还习惯使用中断、但当我写入地址 EEPROM (如果我只能发送一个字节、则为控制字节)以接收 ACK 时、状态寄存器中的标志不会改变。

    总之、感谢您的关注。

    此致、

    迭戈

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

    遗憾的是、您必须等到 EEPROM 将数据写入指定的地址。 EEPROM 数据表提到您必须等待5ms。 我认为您等待的时间不够长。

    此外、根据您的要求、您可以使用分页写入而不是字节写入。

    此致、
    曼诺伊