xMega256A3BU - TWI (I2C)

Gast #5367282
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?
Gast #5367310
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
}
Gast #5367344
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren