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.

[参考译文] MSP430F5438A:在I2C模式下使用TI USCI时,写入/读取函数的行为异常。 UCB2。

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/584702/msp430f5438a-erratic-behavior-of-write-read-functions-when-using-ti-usci-in-i2c-mode-ucb2

部件号:MSP430F5438A

为了缩小问题的范围,我们集中研究了一个数据,IEEE格式的4字节浮点,alarm1Setpoint。  使用IAR调试器和断点,我们最初知道,如果在启动时从main.c调用函数,或从HMI编辑lcd.c调用函数,则在I2C模式下使用TI UART的写入/读取函数可以在此浮点中正常工作。  我们的问题是,如果在HART主控文件中进行编辑后,从文件HARTCMDS.C调用这些相同的函数,则写入和读取函数似乎都失败。 我们已验证发送的参数是否正确(浮点和无符号int numBytes)。  

我们正在向Microchip 24FC1025 EEPROM写入数据或从其写入数据。

 

进一步的测试表明,当从hart调用写入函数时,执行永远不会进入ISR。  当我们从hart调用读取函数时,ISR不会发送发送发送要读取的地址的写入部分,但读取尝试使用ISR读取4个字节。 但是,可能是因为未发送地址,所以我们总是为字节读取0xFF。

 

我已经检查并将#defines添加到hart文件中,以便它与main.c相同,但没有帮助。  由于TI I2C UART的最大波特率为400k,因此我们将波特率减慢至30.7692万。  无帮助。

 

使用逻辑分析器,我们可以看到,在 写入失败期间,当时钟和数据短暂突发时,写保护线会很低,然后突然结束。  根据调试程序,我们不知道当执行不进入ISR时,clk和数据来自何处?

 

请您为我们提出一个前进的方向。

 

感谢您的参与,

 

Mike Raines

 

Hoffer Flow Controls,Inc.

252-202-0894

One0.01万@gmail.com

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    源代码和示波器跟踪将很有帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是写入功能:

    void WriteEepromBlock2 (无符号int地址,无符号char*数据,无符号int numBytes)

    无符号char* dPtr =数据;
    无符号字符地址H = 0x00; //本地
    无符号字符地址L = 0x00; //本地
    内部 一 = 0; //循环计数器
    内部 J = 0; //循环计数器

    // uint 计算Csum = 0;
    //字符 计算CsumL = 0;
    //字符 计算CsumH = 0;

    //===================================================================================================================================================================
    //=================== 将字节发送到EEPROM ===================================================================
    //=================== 确保从地址指向块2=================================

    IF (UCB2I2CSA!= 0x54) //如果不是Block2

    InitializeUcb2Block2();
    }//如果不是块2,则结束

    // DelayMs(idelayTimeTiEepromI2c); //不使用此选项也能正常工作

    //=================== 清除bytesToSend =========================

    对于(i=0;i<bytesToSendSize;i++)

    字节发送[i] = eraseChar;
    }//结束i

    //=================== 加载目标EEPROM地址===========================================
    I = 0; //重置循环计数器

    addressL =(address & 0xFF);
    地址H =(地址>> 8);

    //=================== 将地址和数据加载到bytesToSend ==========================
    bytesToSend[0]=地址H;
    I++;
    bytesToSend[1]=地址L;
    I++;

    对于(j=0;j< numBytes;j++) //对于每个字节

    bytesToSend[i]=*dPtr;
    I++;
    dPtr ++;
    }//结束于j

    ptxData =(unsigned char*)bytesToSend; //为ISR设置指针
    TXByteCtr = I; // 2字节地址,

    //=================== 禁用写保护并将控制权交给ISR ===================

    W巴解 组织; //此处的bytesToSend...断点
    // DelayMs(5); //不使用此选项也能正常工作

    TESTHI;

    UCB2CTL1 |= UCTR + UCTXSTT;

    (UCB2CTL1和UCTXSTP); //旋转直到UCTXSTP位== 1 (直到发送所有字节)

    TESTLO;

    DelayMs(1); //需要这一个,在WPHI之前需要它

    WPHI; //启用写保护


    }// END函数void WriteEepromBlock2 (无符号int地址,无符号char*数据,numBytes)

    //====================================================================================================================================================================================================================================================================
    //====================================================================================================================================================================================================================================================================

    这是在文件LCD.c中工作的函数调用:
    WriteEepromBlock2 (ALBLEVELNV,(unsigned char*)&FCD_FlowCalibrationData.d_AlarmBLevel,float_size);

    这是文件HARTCMDS.C中不起作用的函数调用:
    WriteEepromBlock2( ALBCHOICENV,(uchar *)&tempFloat,float_size );

    我拥有成功和失败的逻辑分析器(如示波器)模式。 如何将它们连接到此线程?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "使用丰富格式",然后使用"插入代码"或"插入媒体"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我终于解开了这个该死的谜团。 我不敢相信这花了我这么长的时间。 问题是以前的开发人员设置了陷阱,我直接掉进了陷阱,没有看到出路。 他在2008年做过这项工作,直到现在为止,因为他正在撞击EEPROM I2C接口。 我选择使用TI I2C UART,它使用中断。 前一位开发商犯了一个主要的ISR罪:他从ISR内部调用ProcessMessage()。 此函数将处理大约7个文件,最后在中间尝试向EEPROM写入和读取,最后返回到ISR并返回。 这会占用TI模块需要写入/读取的中断,从而导致EEPROM写入/读取仅在从特定文件调用函数时失败。 这条路混淆了问题,我花了一个多月的时间才解决。 我希望有人读这本书,可以省回很多心痛。 我已经学会了在我从现在开始的每个项目中检查所有ISR是否违反此规则。