I2C通信有什么问题?

时间:2018-10-02 07:28:51

标签: i2c msp430

我正在尝试通过I2C在传感器和MSP430F5438a之间建立通信。试图从头开始编写代码。此时不使用任何中断。现在要从传感器读取PartID,我正在执行以下步骤:

  1. 主设备发出启动条件,发送从设备地址以进行写入(0b 1010 1110
  2. 主服务器发送寄存器地址(例如0xFF作为部件ID)。
  3. 主机发出重复的启动条件,发送从机地址以进行读取(0b 1010 1111
  4. 主机读取从机返回的数据字节。 (应该取回0x15,它是PartID)。

我的问题是我没有在接收缓冲区中退回任何东西。我的代码可能做错了。但是实际上,不明白我在哪里做错了。任何人都可以帮忙吗?我希望我的硬件连接良好(已与传感器提供商核对)。

我在下面附加我的代码:在Code Composer Studio中将其写入。

#include <msp430.h> 
#include <string.h>

#define MAX30101_I2C_ADDRESS        0x57

void Clock_setup(); // default
void I2C_setup();

int readByte(char register_add);

int ID;

void main()
{
    WDTCTL = WDTPW + WDTHOLD;
    Clock_setup();
    I2C_setup();
    ID = readByte(0xFF);

}

void Clock_setup(){
    P11DIR |= BIT2; // check smclk, 1MHz default
    P11SEL |= BIT2; // check smclk, 1MHz default
    P11DIR |= BIT0; // check aclk, 32.8KHz default
    P11SEL |= BIT0; // check aclk, 32.8KHz default
}

void I2C_setup() {

    P3SEL |= BIT7; // 3.7 UCB1_SDA, 5.4 UCB1_SCL
    P5SEL |= BIT4;
    UCB1CTL1 |= UCSWRST; // reset enable
    UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC; // master + I2C mode + Sync
    UCB1CTL1 = UCSSEL_2 + UCSWRST; //use SMCLK + still reset
    UCB1BR0 = 10; // default SMCLK 1M/10 = 100KHz
    UCB1BR1 = 0; //
    UCB1I2CSA = MAX30101_I2C_ADDRESS; // MAX30101 7 bit address 0x57
    UCB1CTL1 &= ~UCSWRST; // reset clear

}

int readByte(char register_add){
    int rx_byte;

    UCB1CTL1 |= UCTXSTT+ UCTR; // Generating START + I2C transmit (write)
    UCB1I2CSA = 0xAE; // MAX30101 7 bit address 0x57
    UCB1TXBUF = register_add; // sending 0xFF to read the PartID
    while(!(UCB1IFG & UCTXIFG)); //wait until reg address got sent
    while( UCB1CTL1 & UCTXSTT); //wait till START condition is cleared
    UCB1CTL1 |= UCTXSTT; //generate RE-START
    UCB1I2CSA = 0xAF; // MAX30101 7 bit address 0x57
    UCB1CTL1 &=~ UCTR; //receive mode
    while( UCB1CTL1 & UCTXSTT); //wait till START condition is cleared
    rx_byte = UCB1RXBUF; //read byte
    //while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read
    UCB1CTL1 |= UCTXNACK; //generate a NACK
    UCB1CTL1 |= UCTXSTP; //generate stop condition
    while(UCB1CTL1 & UCTXSTP); //wait till stop condition got sent

    return rx_byte;
}

1 个答案:

答案 0 :(得分:0)

I²C从机地址具有7位; 0xAF或0xAE无效。评论已经说0x57是正确的值。

并且您必须等待接收的字节(UCRXIFG)可用,然后才能尝试读取它。

并且此代码缺少所有错误处理;您至少应该检查是否有NACK。