Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

cc430 + tmp102 i2c

[es] :: Elektronika :: Mikrokontroleri :: cc430 + tmp102 i2c

[ Pregleda: 2076 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Damirceda
Nesic Damir
Student(Elektronski fakultet,
mikroelektronika)
Nis

Član broj: 221704
Poruke: 26
*.sc.ni.ac.rs.



Profil

icon cc430 + tmp102 i2c27.05.2011. u 21:57 - pre 156 meseci
Pozdrav svima!

Nisam primetio da na forumu ima nesto puno postova oko TI MSP serije procesora ali rekoh da pitam u svakom slucaju. U okviru projekta mi se javlja potreba da uspostavim i2c komunikaciju izmedju cc430f5135 i temperaturnog senzora tmp102. Obe plocice su custom dok code pisem u IAR worckbench-u. Elem, imam problema sa klokovanjem i sa ulaskom u interrupt radi iscitavanja podataka koje senzor treba da posalje nakon boravka u low power modu.

Ukoliko neko ima nekakvog iskustva sa necim od gore pomenutog molio bih da se javi pa cu da postavim kod, slike sa osciloskopa i sve sto treba.

Hvala.

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: cc430 + tmp102 i2c28.05.2011. u 17:51 - pre 156 meseci
cc su ovi sa vise rama, njih nisam koristio ali ne bi trebalo da je mnogo drugacije od obicnih msp430f... takodje ja koristim gcc a ti iar no opet ne bi trebalo da je velika razlika ...

da li koristis hardwerski ili softwerski i2c na 430tici ?

ako koristis hw i2c, kako si ga iskonfigurisao?
 
Odgovor na temu

Damirceda
Nesic Damir
Student(Elektronski fakultet,
mikroelektronika)
Nis

Član broj: 221704
Poruke: 26
*.sc.ni.ac.rs.



Profil

icon Re: cc430 + tmp102 i2c28.05.2011. u 18:25 - pre 156 meseci
Ma u sustini, manje vise su isti, samo sto CC ima integrisan radio modul za sub 1GHz RF. Koristim hardwerski i2c, podesio sam ga u 5 razlicitih konfiguracija ali recimo da je neka glavna: izvor clocka je SMCLK, delim ga sa 12 ili 120 tako da je odprilike ili 85kHz ili 8.5. Sinhroni mod, 7-bitne adrese, sve standardno. Stvar je u tome sto u svim primerima koje sam nasao citanje tih dva bajta podataka se vrsi u interaptu sa proverom svih interrupt flagova u vectoru USCI_B0_vector (tu su unutra flagovi za Tx interrupt, RX, fault...). Stvar je u tome sto kad ja dam START condition i odem u sleep komunikacija bi trebala da me probudi kad se primi prvi bajt, e to nece. GIE i interrupt RX sa i2c-a su omoguceni ali nece.

Oda sam nasao da tokom slipa procesor gasi SMCLK i zato sam presao na ACLK kao clock za i2c. I sad u sleepu taj ACLK imam na nekom pinu koji sam podesio ali mi ne klokuje magistralu. U svakom slucaju ne mogu nikako da udjem u interrupt. Evo ih podesavanja:

UCSCTL6 = 0xCC; // XT1 on, Xcap max, max drive
/********************************PODESAVANJE I2C i PORTOVA*******************/
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_3+ UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 = 120; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x48; // Set slave address
UCB0IE |= UCRXIE; // Enable RX interrupt

PMAPPWD = 0x02D52; // Get write-access to port mapping regs
P2MAP4 = PM_ACLK; // map ACLK or MCLK to P2.4
P2MAP6 = PM_MCLK; // map ACLK or MCLK to P2.6
P1MAP2 = PM_UCB0SCL; // map SCL to pin 1.2 i2c
P1MAP3 = PM_UCB0SDA; // map SDA to pin 1.3 i2c
PMAPPWD = 0; // Lock port mapping registers

P5SEL |= BIT0 + BIT1; // select this pins for XT1
P2SEL |= (BIT4 | BIT6); // set mapped outputs for P2.4, P2.6
P1SEL |= BIT2 + BIT3; // Assign I2C pins to USCI_B0

P2DIR |= (BIT1 | BIT4 | BIT6); // set xCLK signals out to pins

UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
UCSCTL6 &= ~SMCLKOFF; // enable SMCLK during LPM0
UCSCTL8 |= SMCLKREQEN; //enable modul clock request
/****************************************************************************/

#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
switch(__even_in_range(UCB0IV,12))
{
case 0: break; // Vector 0: No interrupts
case 2: break; // Vector 2: ALIFG
case 4: break; // Vector 4: NACKIFG
case 6: break; // Vector 6: STTIFG
case 8: break; // Vector 8: STPIFG
case 10: // Vector 10: RXIFG
RxByteCtr--; // Decrement RX byte counter
// Decrement RX byte counter
if (RxByteCtr)
{
RxWord = (unsigned int)UCB0RXBUF << 8; // Get received byte
if (RxByteCtr == 1) // Only one byte left?
UCB0CTL1 |= UCTXSTP; // Generate I2C stop condition
}
else
{
RxWord |= UCB0RXBUF; // Get final received byte,
// Combine MSB and LSB
UCB0CTL1 |= UCTXSTP; // Generate I2C stop condition
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
break;
case 12: break; // Vector 12: TXIFG
default: break;
}
}


Kod sam pisao sam, nije samo zalepljen pa nece. Prosao sam kroz njega vise puta u vise verzija, bez interrupta takodje. Sve datasheet-e sam procitao, forume precesljao, prosto ne radi. Sutra ili u ponedeljak cu da zalemim drugi senzor da vidim da ovaj nije mrtav. Kad gledam na osciloskopu, smrdi mi na njega, procesor radi svoje sigurno.

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: cc430 + tmp102 i2c28.05.2011. u 19:13 - pre 156 meseci
siguran sam da si video http://focus.ti.com/general/do...t.tsp?literatureNumber=slaa151

elem, ovaj IAR bas izgleda gadno ... (sledeci put stavi source u CODE tag ( [C O DE ] pa sors pa [ / C ODE] (samo bez razmaka) )

elem .. ja nista ne razumem ovaj tvoj kod .. gde ti je main() ? imas ovaj setup i onda imas isr i to je to? gde ti je glavna petlja sta radis u njoj kako se bacas u nesvest, koji nivo koristis LP3 ili neki drugi (mislim da ti samo lp3 radi posao neko bezsvesnije stanje ne moze da se probudi sa i2c interaptom) ... start condition (one shoot command) moras da saljes u petlji iz main-a (i onda se onesvestis u lp3) ...

dalje ako se ja dobro secam i uz IAR dolazi USI i2c biblioteka .. mnoooogo iskusnije nego da se cimas rucno (ovo je copy paste iz manuala)

Code:

void main(void){
  WDTCTL = WDTPW+WDTHOLD;
  BCSCTL1 = CALBC1_1MHZ;
  DCOCTL = CALDCO_1MHZ;
  P1DIR |= 0x01;
  P1OUT = 0x00;

  TI_USI_I2C_MasterInit(USIDIV_7+USISSEL_2+USICKPL, StatusCallback);
/* 
   Acknowledge polling function - LED blinks continuously until slave device provides an ACK
   TI_USI_I2CSelect(unsigned char SlaveAddress) 
*/

  while(TI_USI_I2CSelect(0x50)){
    P1OUT ^= 0x01;
    // Toggle LED
    for (i = 0; i < 0x3000; i++); // Delay
  }
  P1OUT =0;
  // Slave acknowledged, LED off
  /* 
    Transmit data to the EEPROM device, prefixed by page address 0x01
    TI_USI_I2CWrite(SlaveAddress, Length, Multi, TxData) 
  */
  __disable_interrupt();
  TI_USI_I2CWrite(0x50,9,0,TxData0);
  __bis_SR_register(LPM0_bits + GIE);

  /* 
    Acknowledge polling function - loops continuously until 
    slave device provides an ACK 
  */

  while(TI_USI_I2CSelect(0x50));

  /*
    Transmit data to the EEPROM device, prefixed by 
    page address 0x08
    TI_USI_I2CWrite(SlaveAddress, Length, Multi, TxData)
  */

  __disable_interrupt();
  TI_USI_I2CWrite(0x50, 3, 0, TxData1);
  __bis_SR_register(LPM0_bits + GIE); //*/

  /* 
    Acknowledge polling function - loops continuously until slave device
    provides an ACK 
  */

  while(TI_USI_I2CSelect(0x50));

  /* 
    Reset address counter of the EEPROM device by 
    transmitting the page address to be read 
    from (0x00) (Dummy write)
    TI_USI_I2CWrite(SlaveAddress, Length, Multi, TxData)
  */
  
  __disable_interrupt();
  TI_USI_I2CWrite(0x50,1, 1,TxData0);
  __bis_SR_register(LPM0_bits + GIE);

  /* 
    Read data from the EEPROM device, starting at 
    page address 0x00 
    TI_USI_I2CRead(SlaveAddress, Length, Multi, RxData)
  */

  __disable_interrupt();
  TI_USI_I2CRead(0x50, 10, 1,RxData);
  __bis_SR_register(LPM0_bits + GIE);

  /* 
    This function can be used to end any open I2C transaction.
    Use only if I2C transaction was left open previously by setting stop
    condition bit =1 
  */

  TI_USI_I2CStop();
  for (j = 0;j<10;j++){
    if (RxData[j]!=j){
      while(1);
    }
  }
  P1OUT |= 0x01;
  while(1);
}

int StatusCallback(unsigned char c){
  return TI_USI_EXIT_LPM;
}


samo ne zaboravi da inkludujes USI_I2CMaster.h


 
Odgovor na temu

Damirceda
Nesic Damir
Student(Elektronski fakultet,
mikroelektronika)
Nis

Član broj: 221704
Poruke: 26
*.sc.ni.ac.rs.



Profil

icon Re: cc430 + tmp102 i2c28.05.2011. u 22:23 - pre 156 meseci
:)

Moja greska, nisi me shvatio. Ovo je bio kod za podesavanja i za interrupt rutinu, nije ceo. Inace idem u LPM0. Ovaj IAR koji ja imam nema ugradjene biblioteke tako da... Ali potrazicu, posto sam tek krenuo sa ovim procesorima uzeo sam zdravo za gotovo da ide ovako jer su svi primeri takvi, i svi ih tako koriste, osim ljudi koji su sami pisali svoje biblioteke. Evo recimo jedan od kodova koji bi trebao da radi:

Code:
#include "cc430f5135.h"

unsigned int RxByteCtr;
unsigned int podaci;

int main( void )
{
  
  WDTCTL = WDTPW + WDTHOLD;   // Stop watchdog timer to prevent time out reset
  
  UCSCTL6 = 0xCC;             // XT1 on, Xcap max, max drive
  /********************************PODESAVANJE I2C i PORTOVA*******************/
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  UCB0CTL1 = UCSSEL_3+ UCSWRST;            // Use SMCLK, keep SW reset
  UCB0BR0 = 120;                            // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0I2CSA = 0x48;                         // Set slave address
  UCB0IE |= UCRXIE;                         // Enable RX interrupt
  
  PMAPPWD = 0x02D52;                        // Get write-access to port mapping regs  
  P2MAP4 = PM_ACLK;                         // map ACLK or MCLK to P2.4
  P2MAP6 = PM_MCLK;                         // map ACLK or MCLK to P2.6
  P1MAP2 = PM_UCB0SCL;                      // map SCL to pin 1.2 i2c
  P1MAP3 = PM_UCB0SDA;                      // map SDA to pin 1.3 i2c
  PMAPPWD = 0;                              // Lock port mapping registers 
  
  P5SEL |= BIT0 + BIT1;                     // select this pins for XT1
  P2SEL |= (BIT4 | BIT6);                   // set mapped outputs for P2.4, P2.6
  P1SEL |= BIT2 + BIT3;                     // Assign I2C pins to USCI_B0
  
  P2DIR |= (BIT1 | BIT4 | BIT6);                   // set xCLK signals out to pins
  
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  UCSCTL6 &= ~SMCLKOFF;                     // enable SMCLK during LPM0
  UCSCTL8 |= SMCLKREQEN;                    //enable modul clock request
  /****************************************************************************

 RxByteCtr = 2;                          // Load RX byte counter
    while (UCB0CTL1 & UCTXSTP);             // Da li je poslat start
    UCB0CTL1 |= UCTXSTT;                    // I2C start condition
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0, enable interrupts/

#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  switch(__even_in_range(UCB0IV,12))
  {
  case  0: break;                           // Vector  0: No interrupts
  case  2: break;                           // Vector  2: ALIFG
  case  4: break;                           // Vector  4: NACKIFG
  case  6: break;                           // Vector  6: STTIFG
  case  8: break;                           // Vector  8: STPIFG
  case 10:                                  // Vector 10: RXIFG
    RxByteCtr--;                            // Decrement RX byte counter
                                            // Decrement RX byte counter
  if (RxByteCtr)
  {
    podaci = (unsigned int)UCB0RXBUF << 8;  // Get received byte
    if (RxByteCtr == 1)                     // Only one byte left?
      UCB0CTL1 |= UCTXSTP;                  // Generate I2C stop condition
  }
  else
  {
    podaci |= UCB0RXBUF;                    // Get final received byte,
                                            // Combine MSB and LSB
    UCB0CTL1 |= UCTXSTP;                  // Generate I2C stop condition
    __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
    }
    break; 
  case 12: break;                           // Vector 12: TXIFG
  default: break; 
  }
}


Eto to bi trebalo sve da odradi. Ima tu neki deo koda cisto za ispis da vidim o cemu se radi ali ga nisam stavio jer je neuredan.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: cc430 + tmp102 i2c28.05.2011. u 22:55 - pre 156 meseci

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: cc430 + tmp102 i2c29.05.2011. u 06:04 - pre 156 meseci
ovaj "prazan" je bio mail sledeceg sadrzaja:

probaj lp3

inace - ako si tek krenuo sa msp430 pretpostavicu da nisi kupio IAR nego da trosis ili demo verziju ili si ga mazno sa torenta ... gcc radi odlicno sa msp430 (za cc treba gcc4) .. to je dzaba, legalno a radi extra

ako si vec zaglavio sa iar-om onda ok, to je odlican kompajler ali krekovane verzije ne izlaze bas cesto a ume da ima gadne bagove a za kupovinu je malo poskup
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: cc430 + tmp102 i2c29.05.2011. u 06:19 - pre 156 meseci
sto se koda koji si stavio tice .. kada odes u lpm0 - sta onda ? kad se vratis iz lpm0 on ode u interapt i onda se vrati u tvoj kod i ??!?!? nema uopste kraj main funkcije ...

Code:

RxByteCtr = 2;                          // Load RX byte counter
    while (UCB0CTL1 & UCTXSTP);             // Da li je poslat start
    UCB0CTL1 |= UCTXSTT;                    // I2C start condition
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0, enable interrupts/


bi trebalo nekako ovako:

Code:

 while(1){
    RxByteCtr = 2;                          // Load RX byte counter
    while (UCB0CTL1 & UCTXSTP);             // Da li je poslat start
    UCB0CTL1 |= UCTXSTT;                    // I2C start condition
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0, enable interrupts/
  }


inace kada se obradi interapt ceo mcu se zabode posto "nema gde da nastavi"
 
Odgovor na temu

Damirceda
Nesic Damir
Student(Elektronski fakultet,
mikroelektronika)
Nis

Član broj: 221704
Poruke: 26
*.sc.ni.ac.rs.



Profil

icon Re: cc430 + tmp102 i2c30.05.2011. u 17:05 - pre 156 meseci
Resio sam problem.

Pre svega zalemio sam jedan watch kristal od 32768Hz koji je source-ovao ostale interne, ponovo sve ispodesavao, zamenio senzor i proradilo je. Jedna od caka je bila sto tmp102 treba 26ms da odradi prvu konverziju i onda mora ili da se saceka sa nekim delay-om ili kako sam ja resio davanjem start-stop-start kombinacijom sa dovoljno vremena da odradi konverziju. Iscitao sam bez interrupta:)

Nasao sam veoma fine biblioteke pisane za neki msp430f2xxx nesto ali mogu da se preprave lako pa ako nekome treba neka se javi na PP.

Hvala, pozdrav!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: cc430 + tmp102 i2c30.05.2011. u 17:13 - pre 156 meseci
cek, kako si ocekivao da se bacas u nesvest bez kristala?

drugo fora sa tmp je sto je spor tako da mu kazes "start" i odes na spavanje, on te probudi kad zavrsi .. tako stedis struju ... ako neces interapt nije frka ali tako ne stedis nista
 
Odgovor na temu

Damirceda
Nesic Damir
Student(Elektronski fakultet,
mikroelektronika)
Nis

Član broj: 221704
Poruke: 26
*.sc.ni.ac.rs.



Profil

icon Re: cc430 + tmp102 i2c02.06.2011. u 21:08 - pre 156 meseci
Mislio sam da sam zatvorio temu:)

Da se nadovezem na tvoj odgovor, interrupti sa timer-om i sa pin_change su radili bez eksternog kristala a posto sam pre 10 dana poceo da radim sa ovim procesorima mislio sam da to vazi i za ostale interrupte, cak datasheet kaze da ako se omoguce bitovi za request periferija za clockom iako je procesor u sleep-u da je moguce raditi bez problema.

Elem, uradio sam tmp i odmah posle sam zakacio MPL115A2T1, senzor pritiska, i relativno lako ostvario komunikaciju, timing-e i ostalo. Ipak javlja se jedan problemcic koje me pomalo brine jer i nema bas puno smisla.

Kod oba senzora se javlja isti problem. Prvi bajt koji primim u prihvatni registar UCB0RXBUF kad ga iscitam ima vrednost 0x01. Na osciloskopu se vidi prava vrednost, komunikacija radi ali prvi primljeni bajt mogu da bacim. Kod slanja, prvi bajt koji posaljem posle start condition-a se prosto ne posalje dok vec drugi, treci... sve ide normalno.

Sve ovo sam resio tako sto sam na pocetku radio dva puta citanje jednog istog podatka, a kod slanja upisem u UCB0XBUF nesto bezveze pa posle sta treba i posle sve radi ok.

Da li neko ima predstavu o cemu se radi, u errati za procesor ne pise nista o tome?!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: cc430 + tmp102 i2c02.06.2011. u 21:38 - pre 156 meseci
ako te budi taj "prvi bajt" relativno je cesto da je taj bajt "za bacanje" .. doduse meni se to desavalo sa msp430 samo na seriskom portu nikad na i2c/spi

Citat:
prvi bajt koji posaljem posle start condition-a se prosto ne posalje


to mi vec lici na bag u toj biblioteci
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: cc430 + tmp102 i2c

[ Pregleda: 2076 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.