Salve a tutti, ho realizzato una libreria I2C per un progetto su cui sto lavorando, ma non funziona niente.
Utilizzo la periferica I2C per far comunicare il mio microcontrollore MSP430f249T con un sensore di Temperatura SHTC3. Dopo avere inizializzato la periferica, inizio la procedura per inviare un byte di dati sul bus. Dunque, per prima cosa chiamo la funzione di START che invia uno start sulla line e successivamente scrive lo slave address. Esattamente in questo punto (prima dell'invio dello slave address) le cose non funzionano. In pratica lo start viene eseguito correttamente, ma lo slave address non viene inviato. Inoltre sembra che lo slave tenga giù la linea SDA mantenendo la periferica I2C in BUSY.
Ho collegato un oscilloscopio per verificare cosa stesse succedendo e nulla, esattamente come mi aspettavo non passa nessun dato sul bus se non la condizione di START (la quale funziona solo la prima volta poi fallisce anche lei).
Vi allego i codici in questione;
#pragma location = "APP_INTERNAL_SEG"
void i2c_msp_init(unsigned char DevAddr, USHORT ClkIdDivisor)
{
//P5SEL |= 0x06; // I2C su USCI_B1: SDA sul pin 5.1 e SCL sul pin 5.2; l'I2C è disponibile sulla USCI_B0 e sulla USCI_B1
UCB1CTL1 = UCSWRST; // si entra nella condizione di SW reset
UCB1CTL0 = UCMST | UCMODE_3 | UCSYNC; // I2C Master in synchronous mode
UCB1CTL1 = UCSSEL_2 | UCSWRST; // UCSSEL_2 per utilizzare SMCLK, UCSWRST per restare nella condizione di SW reset
// lvMF
// UCB1BR0 = I2C_FREQ_100K; // fSCL = SMCLK/12 = ~100kHz
// UCB1BR1 = 0;
UCB1BR0 = LOBYTE(ClkIdDivisor) << 2;
UCB1BR1 = HIBYTE(ClkIdDivisor);
UCB1I2CSA = DevAddr; // ad UCB1I2CSA assegna l'indirizzo del dispositivo con cui si deve comunicare
P5SEL |= 0x06;
UCB1CTL1 &= ~UCSWRST; // si esce dall condizione di SW reset
// lvMF
// ATTENZIONE !!!
// NON SI PUO' RICONFIGURARE IL TIMER-A PERCHE' USATO DALLO STACK KNX
// TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
}
#pragma location = "APP_INTERNAL_SEG"
BOOL i2c_msp_start_tx(void)
{
int count01;
int count02;
// while(UCB1STAT & UCBBUSY);
UCB1CTL1 |= (UCTR | UCTXSTT); // I2C TX start: si trasmette UCB1I2CSA
count01 = 0;
while(UCB1CTL1 & UCTXSTT)
{
// si aseptta la fine della tx
count01++;
if(count01 > COUNT_MAX)
return FALSE;
}
count01 = 0;
while(UCB1STAT & UCNACKIFG) // se c'è nack sulla tx si fa repeated start (si invia un nuovo start)
{
count01++;
if(count01 > COUNT_MAX)
return FALSE;
UCB1CTL1 |= UCTR + UCTXSTT; // I2C TX start
count02 = 0;
while(UCB1CTL1 & UCTXSTT) // si aseptta la fine della tx
{
count02++;
if(count02 > COUNT_MAX)
return FALSE;
}
}
return TRUE;
}
P.S. In UCB1BR0 = LOBYTE(ClkIdDivisor) << 2; dimezzo la frequenza per ben 2 volte, l'ho fatto pensando fosse un problema di baudrate (clock di sistema 4MHZ diviso 0xA0 --> 25kHz)
MSP430 I2C non funziona
Moderatore:
Paolino
3 messaggi
• Pagina 1 di 1
0
voti
Si, lo fa in automatico impostando la periferica I2C.
Comunque adesso sembra andare. In pratica non ho fatto altro che riempire il buffer UCB1TXBUF = RegAddr;.
Prima non lo facevo perché inviavo l'indirizzo del registro come dato a parte e invece sembra debba essere fatto in questo modo.
Comunque adesso sembra andare. In pratica non ho fatto altro che riempire il buffer UCB1TXBUF = RegAddr;.
Prima non lo facevo perché inviavo l'indirizzo del registro come dato a parte e invece sembra debba essere fatto in questo modo.
3 messaggi
• Pagina 1 di 1
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 5 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


