Hallo Freunde, ich möchte Daten vom Master zum Slave senden (MSP430G2553). Mein Programm sieht folgendermaßen aus: Mein Programm sieht folgendermaßen aus: /|\ /|\ // MSP430G2xx3 10k 10k MSP430G2xx3 // slave | | master // ----------------- | | ----------------- // -|XIN P1.7/UCB0SDA|<-|---+->|P1.7/UCB0SDA XIN|- // | | | | | // -|XOUT | | | XOUT|- // | P1.6/UCB0SCL|<-+----->|P1.6/UCB0SCL | // | | | | // //********************************************************************** ******** #include <msp430.h> char SLV_Addr = 0x90; unsigned char TXData; unsigned char TXByteCtr; int test = 0; int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT //Universal Serial Communication Interface //Initialization and Reset (452 SLAU144J) The USCI_Bx modules suppport I2C // 1. Set UCSWRST UCB0CTL1 |= UCSWRST; // Enable SW reset //2. Initialize all USCI register with UCSWRST = 1 UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, ,synchronous mode UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset (SMCLK) UCB0BR0 = 12; // bit rate control register 0 fSCL = SMCLK/12 = ~100kHz UCB0BR1 = 0; // bit rate control register 1 UCB0I2CSA = SLV_Addr; //Slave Address is 048h //size of Slave-Adress //3. Configure Ports P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0 Selektionsregister 0 – Digital‐IO P1SEL2|= BIT6 + BIT7; // 1 – Funktionsbaustein P1REN |= 0xC0; // P1.6 & P1.7 Pullups //4. Clear UCSWRST UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation //5. Enable interrupts IE2 |= UCB0TXIE; // Enable TX interrupt //I2C Master Transmitter Mode (459 SLAU144J) TXData = 0x00; // Holds TX data while (1) { TXByteCtr = 1; // Load TX byte counter while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent while (!(IFG2 & UCB0TXIFG)); // Wait while IFG is low UCB0CTL1 |= UCTR + UCTXSTT; // I2C TransmitterMode, start condition __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts // Remain in LPM0 until all data // is TX'd TXData++; // Increment data byte } } //---------------------------------------------------------------------- -------- // The USCIAB0TX_ISR is structured such that it can be used to transmit any // number of bytes by pre-loading TXByteCtr with the byte count. //---------------------------------------------------------------------- -------- #pragma vector = USCIAB0TX_VECTOR __interrupt void USCIAB0TX_ISR(void) { test++; if (TXByteCtr) // Check TX byte counter { UCB0TXBUF = TXData; // Load TX buffer TXByteCtr--; // Decrement TX byte counter } else { UCB0CTL1 |= UCTXSTP; // I2C stop condition IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag __bic_SR_register_on_exit(CPUOFF); // Exit LPM0 } } Es orientiert sich stark an dem Beispiel von TI. Wenn ich das richtig sehe prüfe ich mit while (!(IFG2 & UCB0TXIFG)); // Wait while IFG is low ob die Startbedingungen erfüllt sind: -bus available, generate Start condition, transmits slave adress. In dieser Schleife häng ich fest. Das heißt das irgendwas nicht mit den Startbedinungen stimmt? Wäre nett wenn mir einer helfen könnte. PS: externe Widerstände hab ich nun wegen P1REN nicht angeschlossen. Gruß Smazze
Smazze schrieb: > PS: externe Widerstände hab ich nun wegen P1REN nicht angeschlossen. Solltest du aber tun, und zwar 2.2K, nicht 10K.
Danke für die Antwort. Hatte vor ein paar Tagen mit 2 MSP430G2331 rumgespielt. Da lief das mit den beiden PREN xD Allerdings ist das auch USI ?^^ Einfach beim Master zwischen VCC und Clock und Datenleitung die Widerstände anbring? Weißt du ob auch auch 2kOhm reichen? 2,2 hab ich grad nicht hier :/
Scheint erstmal zu klappen!!! Wunderbar xD DANKE!!! glaub du hast mir viel Zeit und nerven gespaart ;))
:-) 2K gehen auch. 2.2K wird von Phillips empfohlen für VCC=3.3V, für VCC=5V sollten es 4.7K sein. 10K macht halt die steigenden Flanken u.U. so rund, dass keine gesicherte Kommunikation möglich ist. Und eingebaute Pullups sind meistens sogar noch hochohmiger, also total unbrauchbar. Mit deinen 2K Widerständen fließt jetzt halt 0.15mA mehr Strom ggü. 2K2 -> also egal.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.