Forum: Mikrocontroller und Digitale Elektronik xMega256A3BU - TWI (I2C)


von Joseph A. (Gast)


Lesenswert?

Nabend Jungens,

stehe irgendwie vor geschlossenen Türen.
1
uint8_t twi_read(TWI_t *twi, uint8_t reg, uint8_t slaveAddr)
2
{
3
  uint8_t ret = 0;
4
  
5
  twi->MASTER.ADDR = slaveAddr + TWI_WRITE;
6
  while( ! ( twi->MASTER.STATUS & TWI_MASTER_WIF_bm ) );
7
 
8
  twi->MASTER.DATA = reg;
9
  while( ! ( twi->MASTER.STATUS & TWI_MASTER_WIF_bm ) );
10
 
11
  twi->MASTER.ADDR = slaveAddr + TWI_READ;
12
  while( ! ( twi->MASTER.STATUS & TWI_MASTER_RIF_bm ) );
13
  
14
  ret = twi->MASTER.DATA;
15
 
16
  twi->MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;
17
18
  return ret;
19
}

Versuche gerade mit dem oben genannten xMega mit einem I2C Slave zu 
kommunizieren.

Meine Init. sieht so aus..
1
#ifndef F_CPU
2
#define F_CPU                    2e6
3
#endif
4
5
#define TWI_READ                  0x01
6
#define TWI_WRITE                  0x00
7
8
#define F_TWI                    4e5
9
#define TWI_BAUD( FREQUENCY_CPU , FREQUENCY_TWI )  (uint8_t)((FREQUENCY_CPU / (2 * FREQUENCY_TWI)) - 5)
10
#define TWI_BAUDSETTING                TWI_BAUD( F_CPU , F_TWI )
11
12
void twi_init(TWI_t * twiname)
13
{      
14
  twiname->MASTER.CTRLB  |= TWI_MASTER_SMEN_bm;
15
  twiname->MASTER.BAUD  |= TWI_BAUDSETTING;
16
  twiname->MASTER.CTRLA  |= TWI_MASTER_ENABLE_bm;
17
  twiname->MASTER.STATUS  |= TWI_MASTER_BUSSTATE_IDLE_gc;
18
}

PullUps sind vorhanden und gehen an die richtigen Pins.
Die Belegung ist auch korrekt.

Übrigens der Slave ist ein "HMC58831"
1
#define HMC58831_ADDR  ( 0x1E << 1 )
2
#define HMC58831_READ  ( ( HMC58831_ADDR << 1 ) | 0x01 )
3
#define HMC58831_WRITE  ( HMC58831_ADDR << 1 )

Jemand auf anhieb eine Idee?

von Bastian W. (jackfrost)


Lesenswert?

Was geht denn nicht ?

Gruß JackFrost

von Joseph A. (Gast)


Lesenswert?

Bastian W. schrieb:
> Was geht denn nicht ?
>
> Gruß JackFrost

Versuche Ich was zu lesen, bleibt er hier hängen..
1
uint8_t twi_read(TWI_t *twi, uint8_t reg, uint8_t slaveAddr)
2
{
3
  uint8_t ret = 0;
4
  
5
6
  twi->MASTER.ADDR = slaveAddr + TWI_WRITE;
7
  while( ! ( twi->MASTER.STATUS & TWI_MASTER_WIF_bm ) ); /* HIER BEKOMMT ER DAS BIT NICHT */
8
 
9
  twi->MASTER.DATA = reg;
10
  while( ! ( twi->MASTER.STATUS & TWI_MASTER_WIF_bm ) );
11
 
12
  twi->MASTER.ADDR = slaveAddr + TWI_READ;
13
  while( ! ( twi->MASTER.STATUS & TWI_MASTER_RIF_bm ) );
14
  
15
  ret = twi->MASTER.DATA;
16
 
17
  twi->MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;
18
19
  return ret;
20
}

von Joseph A. (Gast)


Lesenswert?

Joseph A. schrieb:
> Bastian W. schrieb:
>> Was geht denn nicht ?
>>
>> Gruß JackFrost
>
> Versuche Ich was zu lesen, bleibt er hier hängen..uint8_t twi_read(TWI_t
> *twi, uint8_t reg, uint8_t slaveAddr)
> {
>   uint8_t ret = 0;
>
>
>   twi->MASTER.ADDR = slaveAddr + TWI_WRITE;
>   while( ! ( twi->MASTER.STATUS & TWI_MASTER_WIF_bm ) ); /* HIER BEKOMMT
> ER DAS BIT NICHT */
>
>   twi->MASTER.DATA = reg;
>   while( ! ( twi->MASTER.STATUS & TWI_MASTER_WIF_bm ) );
>
>   twi->MASTER.ADDR = slaveAddr + TWI_READ;
>   while( ! ( twi->MASTER.STATUS & TWI_MASTER_RIF_bm ) );
>
>   ret = twi->MASTER.DATA;
>
>   twi->MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;
>
>   return ret;
> }

Ah okay..
Wenn ich anstatt
1
#ifndef F_CPU
2
#define F_CPU                    32e6
3
#endif
1
#ifndef F_CPU
2
#define F_CPU                    32000000
3
#endif

schreibe, scheint es zu klappen. Was macht der Kompiler hier anders?

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
Noch kein Account? Hier anmelden.