В чем проблема с I2C Communication? - PullRequest
       23

В чем проблема с I2C Communication?

0 голосов
/ 02 октября 2018

Я пытаюсь установить связь между датчиком и MSP430F5438a через I2C.Пытаюсь написать код с нуля.На этом этапе не используется прерывание.Теперь, чтобы прочитать PartID с датчика, я выполняю следующие шаги:

  1. Мастер выдает условие запуска, отправляет адрес подчиненного устройства для записи (0b 1010 1110)
  2. Мастер отправляет адрес регистра (например, 0xFF для идентификатора детали).
  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 голосов
/ 02 октября 2018

I²C подчиненные адреса имеют 7 битов;0xAF или 0xAE не могут быть действительными.В комментариях уже сказано, что 0x57 является правильным значением.

И вы должны дождаться, пока полученный байт станет доступным (UCRXIFG), прежде чем пытаться его прочитать.

И в этом коде отсутствует вся обработка ошибок;Вы должны хотя бы проверить NACK.

...