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:有关将 MSP430F5438A 连接到 Adafruit MPRLS 压力传感器的 I2C 问题

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/898502/msp430f5438a-i2c-issue-about-connecting-msp430f5438a-with-the-adafruit-mprls-pressure-sensor

器件型号:MSP430F5438A

大家好、我想通过 I2C 将 MSP430F5438A 与 MPRLS 压力传感器相连。  

我使用的晶振为29.5MHz、我使用 UCB1CLK 和 UCB1SDA。

我尝试了 I2C 示例代码"msp430x54xA_uscib0_i2c_06.c"以确保 MSP430可以向外发送数据。

但是、我发现代码总是在中断矢量中停止。

尤其是它会停下来  

以下是我的代码:

#include 
#define CRYSTICL_295
unsigned char TXData;
unsigned char TXByteCtr;

void init_clock (void);

int main (void)
{
int i;
//WDTCTL = WDTPW + WDTHOLD; //停止 WDT
init_clock();
P3SEL |= BIT7; //将 I2C 引脚分配给 USCI_B0
P5SEL |= BIT4;
__disable_interrupt ();
UCB1CTL1 |= UCSWRST; //启用 SW 复位
UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式
UCB1CTL1 = UCSSEL_SMCLK + UCSWRST; //使用 SMCLK、保持软件复位
UCB1BR0 = 12; // fSCL = SMCLK/12 =~100kHz
UCB1BR1 = 0;
UCB1I2CSA = 0x18; //从器件地址为048h
UCB1CTL1 &=~UCSWRST; //清除 SW 复位,恢复
运行(i=0;i<100;i++){};
UCB1IE |= UCTXIE; //启用 TX 中断

TXData = 0x01; //保持 TX 数据

、同时(1)
{
TXByteCtr = 1; //加载 TX 字节计数器

while (UCB1CTL1 & UCTXSTP); //确保发送了停止条件
UCB1CTL1 |= UCTR + UCTXSTT; // I2C TX、启动条件

_bis_SR_register (LPM0_bits + GIE); //输入带中断的 LPM0
__no_operation(); //保持在 LPM0中直到所有数据
//是 TX

TXData++; //递增数据字节
}
}-->-----------------


// USCIAB0_ISR 的结构使其可用于通过
预加载带有字节计数的 TXByteCtr 来发送任何//字节数。
///----------------------------------

#pragma vector = USCI_B1_Vector
__INTERRUPT void USCI_B1_ISR (void)

{
switch (_even_in_range (UCB1IV、12))
{
case 0:break; //向量0:无中断
情况2:中断; //向量2:ALIFG
情况4:中断; //向量4:NACKIFG
情况6:中断; //向量6:STTIFG
情况8:中断; //向量8:STPIFG
情况10:中断; //向量10:RXIFG
情况12: //向量12:TXIFG
IF (TXByteCtr) //检查 TX 字节计数器
{
UCB1TXBUF = TXData; //加载 TX 缓冲区
TXByteCtr --; //减量 TX 字节计数
器}
其他
{
UCB1CTL1 |= UCTXSTP; // I2C 停止条件
UCB1IFG &=~UCTXIFG; //清除 USCI_B0 TX int 标志
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
}
中断;
默认值:中断;
}


/*********
函数:init_clock
用途:初始系统时钟
参数:无
返回值:无
/
void init_clock (void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
P5SEL |= 0x0C;//端口选择 XT2
UCSCTL6 &=~XT2OFF;//即使未使用
也可以
启用 XT2 #ifdef crystal_295 CLR6 |= 0xT2OFF

;//如果未使用则启用 // FLLref = REFO
UCSCTL4 |= SELA_XT2CLK;//从 XT2-16M
UCSCTL4中选择源|= IVA_5 + SELM_5;// SMCLK=MCLK=XT2-16M
_NOP ();
#ifdef CRYS_OSCTL295 |
= DIVA_5 + SEL_;// XFFT2+
D_+ DCODx


~+ DFFD_+ Dx + DFFDx + Dx + T2M_+ T2M_+ DFFT2M_+ DFFDx + T2M_+ DFFDCO+ Dx + DFFDx + Dx + T2M_+ DFFT2M_+ DFFDCO+ Dx + DFFDx + Dx + DFFT2M_+ D
~ //清除
(i=0;i<0xFFFF;i++)的故障标志;// OSC 稳定的延迟
} while (SFRIFG1&OFIFG);//测试振荡器故障标志
} 

我使用 IAR Embedded Workbench IDE 并设置断点以检查问题。

我确定它将进入中断矢量、如下所示:

但是、如果我单击"GO"来继续程序、它不会进入下一个断点:UCB1CTL1 |= UCTXSTP

我不知道发生了什么...是否有人可以帮助我解决这个问题?

提前非常感谢!

Michelle

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

    I2C 的一个非常常见的问题是未能在 SDA 和 SCK 上使用上拉电阻器。 你有这些吗? 对于100kHz 时钟、10k 电阻器将是一个不错的选择。

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

    你(们)好,Michelle

    >>但是、如果我单击"Go"继续执行程序、它将不会进入下一个断点:UCB1CTL1 |= UCTXSTP:

    请检查 TXByteCtr 的值/状态。

    同意 Mike 的说法、请检查 SDA 和 SCK 上的上拉电阻

    谢谢!

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

    尊敬的 Mike:

    感谢您的有用建议。

    我没有使用上拉电阻器... 在我按照建议在 SDA 和 SCK 上使用10K 电阻器后、效果很好!  

    我还想知道、您如何确定 SDA/SCK 上电阻器的欧姆值?  

    非常感谢!

    Michelle

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

    尊敬 的李晓东:

    非常感谢!

    我检查了我的电子器件、注意到我没有使用上拉电阻器。

    使用它们后、它解决了我的问题!

    Michelle

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

    Michelle 选择 I2C 中的上拉电阻是在时钟速度和功耗之间进行权衡的结果。  选择时钟速率时、必须考虑集电极开路(漏极)输出晶体管和总线的 RC 时间常数。 如果 RC 过大、时钟信号将失真、例如集成。 为了防止这种情况发生、必须降低上拉电阻、因为您无法控制晶体管输出电容。 另一方面、如果电阻过小、晶体管中的电流会在导通时增加。 在极限条件下、当 R 变为零时、晶体管不会导通、并且无法用作开关。

    选择上拉电阻器并不重要。 设计人员将在100kHz 时使用10k、在500kHz 时使用4.7K。 TI 在此提供了一个很好的指南:

    http://www.ti.com/lit/an/slva689/slva689.pdf

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

    尊敬的 Mike:

    感谢您的快速回复和清晰的解释。

    此外、感谢您分享本文档、了解如何选择上拉电阻器对我来说非常有帮助!  

    Michelle

    [引用用户="Mike_H_59"]

    Michelle 选择 I2C 中的上拉电阻是在时钟速度和功耗之间进行权衡的结果。  选择时钟速率时、必须考虑集电极开路(漏极)输出晶体管和总线的 RC 时间常数。 如果 RC 过大、时钟信号将失真、例如集成。 为了防止这种情况发生、必须降低上拉电阻、因为您无法控制晶体管输出电容。 另一方面、如果电阻过小、晶体管中的电流会在导通时增加。 在极限条件下、当 R 变为零时、晶体管不会导通、并且无法用作开关。

    选择上拉电阻器并不重要。 设计人员将在100kHz 时使用10k、在500kHz 时使用4.7K。 TI 在此提供了一个很好的指南:

    http://www.ti.com/lit/an/slva689/slva689.pdf

    [/报价]