Thắc mắc I2C

Nguyễn Hữu Sang

Thành Viên PIF
Tình hình là em viết code để 2 con G2553 giao tiếp vs nhau = i2c, master truyền 1 số i(tăng sau mỗi giây) cho slave, slave hiện số đó lên LCD. Nhưng không hiểu sau PC của master dừng ở dòng "while(UCB0CTL1 & UCTXSTT);" không thoát được. Nhờ mấy anh chị xem giúp :(
Code:
#include "STE2007.h"
#include <msp430.h>
 
//Transmitter
unsigned char i=10;
 
void i2c_initiate(){
    P1SEL |= BIT6 + BIT7;
    P1SEL2 |= BIT6 + BIT7;
    //P1REN |= BIT6 + BIT7;
    //P1OUT |= BIT6 + BIT7;
    UCB0CTL1 |= UCSWRST;
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
    UCB0CTL1 = UCSSEL_2 + UCSWRST;
    UCB0BR0 = 12;
    UCB0BR1 = 0;
    UCB0I2CSA = 0x05;
    UCB0CTL1 &= ~UCSWRST;
}
int main(void){
    WDTCTL = WDTPW + WDTHOLD;
    i2c_initiate();
    IE2 |= UCB0TXIE;
    UCB0CTL1 |= UCTR + UCTXSTT;
    while(UCB0CTL1 & UCTXSTT);
    UCB0TXBUF = i;
    while(1){
        __bis_SR_register(CPUOFF + GIE);
    }
}
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCI_ISR(void){
    __delay_cycles(1000000);
    UCB0TXBUF = i++;
    __bic_SR_register_on_exit(CPUOFF);
}
 
//Receiver
/*
unsigned char i;
void lcd_put_num(unsigned char c, unsigned char a, unsigned char b){
    unsigned char x,y,z;
    x=c-c%100;
    y=c%100-c%10;
    z=c%10;
    lcd_gotoxy(a,b);
    lcd_putc(x);
    lcd_putc(y);
    lcd_putc(z);
}
void i2c_initiate(){
    P1SEL |= BIT6 + BIT7;
    P1SEL2 |= BIT6 + BIT7;
    //P1REN |= BIT6 + BIT7;
    //P1OUT |= BIT6 + BIT7;
    UCB0CTL1 |= UCSWRST;
    UCB0CTL0 = UCMODE_3 + UCSYNC;
    UCB0CTL1 = UCSSEL_2 + UCSWRST;
    UCB0BR0 = 12;
    UCB0BR1 = 0;
    UCB0I2COA = 0x05;
    UCB0CTL1 &= ~UCSWRST;
}
int main(void){
    WDTCTL = WDTPW + WDTHOLD;
    lcd_init();
    lcd_clear();
    i2c_initiate();
    IE2 |= UCB0RXIE;
    UCB0I2CIE |= UCSTTIE;
    while(1){
        __bis_SR_register(GIE + CPUOFF);
        lcd_put_num(i,20,4);
    }
}
#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCI_ISR(void){
    UCB0STAT &= ~UCSTTIFG;
    i = UCB0RXBUF;
    __bic_SR_register_on_exit(CPUOFF);
}
*/
Ps: mạch cắm testboard , trở kéo 10k, không biết có ảnh hưởng j ko???
 

nguyễn đình huân

Cố Vấn CLB
Trong datasheet có ghi là "If there is no data loaded to UCBxTXBUF before the acknowledge cycle, the bus is held during the acknowledge cycle with SCL low until data is written into UCBxTXBUF". Trong hàm main của master, bạn thử đưa dòng
UCB0TXBUF = i;
lên trước dòng
while(UCB0CTL1 & UCTXSTT);
 

Nguyễn Hữu Sang

Thành Viên PIF
Em biết sai chỗ nào rồi, như anh nói và thêm cái interrupt vector của slave là USCIAB0TX_VECTOR.
Cho em hỏi thêm là 2 cái vector ngắt đó chứa những cờ ngắt nào vì user guide ko có nói. Với lại thay vì kéo trở ngoài mình kéo trở nội có được không (vì trong thư viện I2C của clb nói là kéo trở nội được) nhưng em làm ko chạy.:2cool_after_boom:
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Cái I2C "đỏng đảnh" lắm.. :3 Nên kéo trở ngoại cho chắc :v
 
Top