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.

[参考译文] MSP430G2553:两个 MSP430g2553之间的 I2C 通信

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1423664/msp430g2553-i2c-communication-between-two-msp430g2553

器件型号:MSP430G2553

工具与软件:

我设置两个  MSP430g2553之间的 I2C 通信。 我的从器件  MSP430g2553处于传输模式。  从设备执行 ADC 过程、在该过程中、电位器连接到其中一个通道。 主器件处于接收模式、从从器件获取该数据并通过 UART 发送。 我所面临的问题是、当我在示波器上进行检查时、SCL 和 SDA 信号仍然为高电平。 我在此处包含了我的主代码和从代码。

MASTERCODE (码)...

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <msp430.h>
unsigned char RXData[2];
unsigned int RXADCValue; // Variable to store the reconstructed 10-bit ADC value
void configure_uart(void); // Function to configure UART
void uart_print(char *str); // Function to print a string over UART
void uart_print_number(unsigned char num); // Function to print a number over UART
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
// ** UART Configuration **
configure_uart(); // Initialize UART for serial communication
P1OUT &= ~BIT0; // P1.0 = 0 (Turn off LED)
P1DIR |= BIT0; // P1.0 set as output
// ** I2C Configuration **
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

从代码...

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//
//******************************************************************************
#include <msp430.h>
unsigned char TXData[2] = {0,0}; // Variable to hold TX data (ADC value)
unsigned int adc_values[16]; // Buffer to hold 16 ADC samples (for the ADC reference code structure)
//unsigned int *adc_ptr = adc_values; // Pointer to iterate through ADC buffer
void configure_adc(void); // Function to configure ADC
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop Watchdog
// Configure LED on P1.0 for indication
P1DIR |= BIT0; // Set P1.0 as output (LED)
P1OUT &= ~BIT0; // Turn off LED initially
// Configure I2C pins
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

I ma 通过10k 上拉电阻器连接 SDA 和 SCL。 我有一个公共接地和电源。

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

    您是否正在使用 Launchpad? 如果是、您是否从 J7 (P1.6/LED)上移除了跳线?

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

    是的、我正在使用 LaunchPad、并且在使用之前移除了跳线 J7。 我的代码是否正确、或者它们有一些问题。

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

    我看不出你所做的事情有什么明显的错误,但这也在我的测试设备上失败了,所以这是我们都缺少的东西。 我还没有找到原因。

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

    我看到了与您相同的症状(UCTXSTT 之后完全没有活动)。 经过大量实验、我尝试使用更强的上拉电阻(4.7K)、它立即开始工作。 我不知道为什么会这样。

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

    您是否收到了正确的 ADC 值?

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

    我没有将 A5引脚连接到任何东西、因此我不知道 ADC 数据(在主器件处)是否合理。

    我确实注意到一些异常行为、我想一旦您超过了最初的症状、您就会修复(根据您的偏好)。

    首先、由于主控方从不发出停止命令(UCTXSTP)、它不断地读取 Rx 字节、并且几乎将所有字节都丢弃。 随后的启动(实际上是重复启动)会重新启动从器件、但同步可能会关闭。 我的建议:

    1) 1)在 ISR 中或从 LPM 返回后发出停止条件。 这并不完美、但它已经足够接近了。

    2)在从器件中、启动时复位 BYTE_COUNTER=0。 这将为下一个事务重新同步。

    第二、我不知道为什么(在从器件中)需要 CONSEQ=2并且 MSC=1。 这会产生大量数据、您只能使用很少的数据、并使从属设备不必要地忙碌。 你可能更喜欢 CONSEQ=0 (可能带有 I2C ISR 的完成联锁-这会很快)。  

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

    我还将上拉电阻更改为4.7千欧、它现在可以正常工作。 但我在终端上接收的 ADC 数据是0。对于任何电压(使用电位器)。 我将执行你提出的建议。