Werte Community, folgendes Problem: Gewünscht ist das Auslesen von Sensordaten mithilfe des Repeated-Start-Protocols. Wie in den Bildern im Anhang zu sehen ist, wird aber nach dem Senden der Slaveadresse immer ein No-Acknowledgebit gesendet bevor überhaupt Daten ausgetauscht werden. Genutzt werden soll der MSP430G2553 mit dem Bodenfeuchtesensor von Chirp bzw alternativ habe ich hier noch einen SI7021. Das Problem besteht mit beiden Sensoren. Ein defekt eines Sensors ist daher unwahrscheinlich. Die Pullups zwischen VCC und SDA bzw SCL wurden nicht vergessen. Mittlerweile habe ich das auszuführende Programm soweit minimiert, dass meineserachtens nach nur noch die Adresse des Slave und ein Datenbyte mit einer Registeraddresse des Sensors gesendet wird, welches ja eigentlich für das Repeated-Start-Protocol benötigt wird. Für den Si7021 ist die Adresse laut Datenblatt 0X40 und das Register wäre bspw. 0xF5. https://www.tindie.com/products/miceuz/i2c-soil-moisture-sensor/ https://ex-store.de/dokumente/Si7021-A20.pdf
1 | #include <msp430.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | WDTCTL = WDTPW + WDTHOLD; // Stop WDT |
6 | P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0 |
7 | P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0 |
8 | UCB0CTL1 |= UCSWRST; // Enable SW reset |
9 | UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode |
10 | UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset |
11 | UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz |
12 | UCB0BR1 = 0; |
13 | UCB0I2CSA = 0x40; // Slave Address |
14 | UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation |
15 | IE2 |= UCB0TXIE; // Enable TX interrupt |
16 | |
17 | while (1) |
18 | {
|
19 | while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent |
20 | UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition |
21 | __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts |
22 | // Remain in LPM0 until all data
|
23 | // is TX'd
|
24 | }
|
25 | }
|
26 | |
27 | #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
28 | #pragma vector = USCIAB0TX_VECTOR
|
29 | __interrupt void USCIAB0TX_ISR(void) |
30 | #elif defined(__GNUC__)
|
31 | void __attribute__ ((interrupt(USCIAB0TX_VECTOR))) USCIAB0TX_ISR (void) |
32 | #else
|
33 | #error Compiler not supported!
|
34 | #endif
|
35 | {
|
36 | UCB0TXBUF = 0xF5; // Load TX buffer |
37 | UCB0CTL1 |= UCTXSTP; // I2C stop condition |
38 | IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag |
39 | __bic_SR_register_on_exit(CPUOFF); // Exit LPM0 |
40 | }
|
Hoffnungsvoll & mit freundlichen Grüßen Ulf