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.

[参考译文] MSP430F5529:在从属模式下通过I2C传输数据时出现问题

Guru**** 2589280 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/630721/msp430f5529-problem-transmitting-data-via-i2c-in-slave-mode

部件号:MSP430F5529

您好,

我尝试在从属模式下通过i2c将数据从MSP430F5529发送到imx7 Sabre板。 在Sabre上进行读取时,我看不到写入传输缓冲区(UCB1TXBUF)的数据。

我不知道我做错了什么。 我的代码如下所示。 请有人帮忙吗?

#include <MSP4S.h>

unsigned char *PRxData;//指向RX数据的指针
无符号的char RXByteCtr;
未签名的char TXByteCtr;
volatile unsigned char RXData[128];
未签名的char TxData;

void SetupI2C(void);

/**
主要c
*/
内部主(无效)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

SetupI2I2();
P1DIR |= 0x01;
P1OUT &=~(0x01);
TxData = 0;
TXByteCtr = 0;
RXData[0]=44;

同时(1)

PRxData =(unsigned char *) RXData;// RX缓冲区开始
RXByteCtr = 0;//清除RX字节计数
__bis_sr_register(LPM0_bits + GIE);//输入LPM0并等待中断
P1OUT ^= 0x01;//切换WFP 1.0
__no_operation();//设置断点>>此处<<并阅读
}// RXData

返回0;
}

// USI_B1数据ISR
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector = USI_B1_Vector
__interrupt void USI_B1_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_B1_vector))) USI_B1_ISR (void)
#否则
错误编译器不受支持!
#endif

SWITCH(__EIV_IN_RANGE(UCB1IV,12))

案例0:中断;//矢量0:无中断
案例2:中断;//矢量2:ALIFG
案例4:中断;//矢量4:NACKIFG
案例6://矢量6:STTIFG

UCB1IFG &=~UCSTIFG;
中断;
}
案例8://矢量8:STPIFG

UCB1IFG &=~UPSTPIIFG;
TXByteCtr = 0;
//UCB1TXBUF = RXData[TXByteCTR+];
//IF (RXByteCtr)//检查RX字节计数器
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);
中断;
}
案例10://矢量10:RXIFG

*PRxData++= UCB1RXBUF;//将RX字节输入缓冲区
RXByteCtr ++;
中断;
}
案例12://矢量12:TXIFG

UCB1TXBUF = TxData++;
//__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);
中断;
}
默认值:中断;
}
}

void设置I2C (void)

P4SEL || BIT1 + BIT2;
UCB1CTL1 || UCSWRST;//启用软件重置
UCB1CTL0 = UCMODE_3 + UCSYNC;// I2C从属,同步模式
UCB1BR1 = 0;//分隔符字的高位字节
UCB1BR0 = 10;//时钟= SMCLK / 10 = 100 KHz
UCB1I2COA = 0x39;//自有地址为039h
UCB1CTL1 &=~UCSWRST;//清除软件重置,恢复操作
//UCB1IE |= UCRXIE;//启用RX中断
UCB1IE || UCSTPIE + UCSTTIE + UCRXIE + UCTXIE;//启用STT,STP和RX中断
}

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

    在您的代码中没有任何突出的,固有的错误。 您的外部上拉电阻值是多少? 您是否可以确认TXIFG案例已输入UCB1 ISR内部? 您能否进一步描述您的I2C序列并提供示波器或逻辑分析仪屏幕截图?

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在Sabre板上,我有一个尝试读取数据的小测试程序。 代码如下所示: 

    char readBuffer[1];
    char地址[]={0};
    write (i2cDevice, address, 1);
    read (i2cDevice, ReadBuffer,1); 

    这里有什么问题吗? 在我进行读取之前,我是否必须写入寄存器地址(0)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不需要,您不需要将虚拟数据写入MSP430。 我对您的读取功能,i2cDevice值以及我之前提出的问题感兴趣。

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

    哪个上拉电阻值? 对于端口-哪个是端口4? 我是否需要设置P4Ren?

    我确认已输入TXIFG案例。

    抱歉,我无法提供示波器或逻辑分析仪屏幕截图。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    I2C总线需要外部上拉电阻器,我不是指MSP430上使用的内部电阻器。 输入TXIFG意味着主机正在正确发送起始位,从属地址和读取位。 之后,它应释放数据线,以便MCU在提供时钟时进行控制。

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

    imx7处理器上I2C总线上的上拉式电阻器都是2.2k。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    结果我使用的是i2c总线上已经在使用的地址!