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.

[参考译文] Linux/MSP430F5529:MSP430F5529 I2C更改时钟I2C阻止

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/653266/linux-msp430f5529-msp430f5529-i2c-changed-clock-i2c-blocked

部件号:MSP430F5529

工具/软件:Linux

大家好,新年快乐!

我将MSP430F5529上的时钟从20MHz更改为24MHz,以便能够使用USB-BSL并具有高频时钟。 从那以后,我似乎无法通过I2C发送数据。  我曾经尝试过使用SMCLK和ACLK将I2C频率提高到12MHz和6MHz,但它似乎不起作用,我以前在20MHz时钟上是否使用了具有SMCLK的10MHz I2C。

这似乎不是电气问题,因为当我恢复到20MHz时钟时,它工作正常。

因此,我请求您的帮助和知识,请帮助:

我使用TI库,我的代码:

Clock.h/c:

#define clock_RATE_MCLK 2400万
#define clock _MS_MCLK 2万
#define clock_rate.SMCLK 1200万
#define clock_rate.ACLK 600万

GPIO _setAsPeripheralModuleFunctionInputPin (XT2_PIN_1);
GPIO _setAsPeripheralModuleFunctionInputPin (XT2_PIN_2);

//将速度时钟单独设置为UCS章节数据表中授权的速度
UCS_setExternalClockSource (3.2768万,Clock_RATE_MCLK);// XT2=24MHz NO XT1

//设置Vcore以适应允许的最大系统速度
PMM_setVCore (PMM_Core_LEVEL_3);

//初始晶体(不是Meth)
UCS_turnOnXT2 (UCS_XT2_DRIVE_4MHz_8MHZ);//高频率
UCS_TurnOffXT1();

//使用晶体来设置时钟;时钟越慢,耗电越少
UCS_initClockSignal (UCS_MCLK,UCS_XT2CLK_SELECT,UCS_CLock_diver_1);//时钟为24MHz
UCS_initClockSignal (UCS_SMCLK,UCS_XT2CLK_SELECT,UCS_CLock_diver_2);//时钟频率为12MHz
UCS_initClockSignal (UCS_ACLK,UCS_XT2CLK_SELECT,UCS_CLock_diver_4);// 6MHz时钟 

I2C初始化:

GPIO_setAsPeripheralModuleFunctionOutputPin (pression_sensor_B1);

USSCI_B_I2C_initMasterParam;
param.selectClockSource = USSCI_B_I2C_CLKSOURCE_ACLK;
param.i2cClk = Clock_RATE_ACLK;//6MHz
param.datarate = USCI_I2C_USI_B1_B1

;USCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_B1B1; UB1B1_UB1B1; USCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SC1B1; U



USI_B_I2C_setMode (USI_B1_BASE,USI_B_I2C_Transmit_mode);

USI_B_I2C_DisableInterrupt (USI_B1_BASE,USI_B_I2C_Transmit_Interrupt); USI_B_I2C_DisableInterrupt (USI_B1_BASE,USI_B_I2C_Receive_Interrupt);

I2C发送:

USI_B_I2C_masterSendSingleByte (USI_B1_BASE,DATA);
ms_delay (1);
USI_B_I2C_clearInterrupt (USI_B1_BASE,USI_B_I2C_Transmit_Interrupt);
USI_B_I2C_clearInterrupt (USI_B1_BASE,USI_B_I2C_STOP_INTERRUPT); 

TI的驱动器I2C:

Void USI_B_I2C_masterSendSingleByte (uint16_t baseAddress,
UINT8_t txData)
{
//存储当前TXIE状态
UINT8_t txieStatus = HWREG8 (baseAddress + OFS_UCBxIE)& UCTXIE;

//禁用传输中断启用
HWREG8 (baseAddress + OFS_UCBxIE)&=~(UCTXIE);

//发送启动条件。
HWREG8 (baseAddress + OFS_UCBxCTL1)|| UCTR + UCTXSTT;

//传送中断标志轮询。
while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG))
{
;}


//发送单字节数据。
HWREG8 (baseAddress + OFS_UCBxTXBUF)= txData;

//传送中断标志轮询。
while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG))
{
;//此处为BLOOCKED
}

//发送停止条件。
HWREG8(basAddress + OFS_UCBxCTL1)|= UCTXSTP;

//在再次启用中断之前清除传输中断标志
HWREG8 (baseAddress + OFS_UCBxIFG)&=~(UCTXIFG);

//恢复传输中断启用
HWREG8(basAddress + OFS_UCBxIE)|= txieStatus;
} 

谢谢!

奥雷利亚

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否通过示波器或逻辑分析仪在引脚上看到I²C Ω 信号?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在我的6MHz ACLK中,我在I2C线路上看不到任何数据或时钟。 但我确实看到SCL的160/180ns的发光水平正在降低,这可以归因于我的时钟和我认为的开始(1/6MHz=166ns)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Aurelia,

    由于XT2以24MHz摆动,您能否尝试在“UCS_XT2_DRIVE_4MHz_8MHZ”功能中将XT2的驱动器强度从“UCS_XT2_DRIVE_16MHz_24MHZ”或“UCS_XT2_DRIVE_24MHZ_32MHz”更改为“UCS_XT2()”?

    此致,

    詹姆斯

    MSP客户应用程序

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

    感谢您的想法。 我纠正了我的错误,但这不能解决我的问题。  

    我有时钟和数据,一开始就会中断,然后不会发送任何内容(请参见下图)。

    否则,我想知道,我在USCB0上有一个使用SMCLK旋转的屏幕,是否会使USCB1上的I2C使用ACLK旋转?

    感谢大家的帮助。

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

    您好Aurelia,

    当您将DCO频率从20MHz提高到24MHz时,您是否确定电源电压和PMMCOREVx设置允许24MHz? 我怀疑这就是为什么你看到了不同的行为。

    有关  推荐值,请参阅第20页顶部的表格和数据表中的图5-1。 《 用户指南》的第2.1 节也对此进行了讨论

    此致,

    詹姆斯

    MSP客户应用程序