Hey,
ich möchte einen Chip von TI via I2C ansprechen.
Da ich bisher noch nicht damit gearbeitet habe, hab ich mir den
Beispielcode von Microchip runtergeladen
(http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en559417)und
ihn auf meinen Chip angepasst, Adresse vom Chip und BRG-Register auf
100kHz.
Mein Problem ist, dass er nachdem er die Startbedingung
(I2C1CONbits.SEN=1;) gesetzt hat keinen Masterinterrupt auslöst.
die Loop meiner Main
1 | while(1)
|
2 | {
|
3 | if(enable==1)
|
4 | {
|
5 | enable=0;
|
6 | // Write Data
|
7 |
|
8 | i2cmem.oData=&wData;
|
9 | i2cmem.cmd = I2C_WRITE;
|
10 |
|
11 | while(i2cmem.cmd!=I2C_IDLE )
|
12 | {
|
13 | i2cmem.tick(&i2cmem);
|
14 | }
|
15 |
|
16 | // Read Data
|
17 | i2cmem.oData=&rData;
|
18 | i2cmem.cmd = I2C_READ;
|
19 | while(i2cmem.cmd!=I2C_IDLE)
|
20 | {
|
21 | i2cmem.tick(&i2cmem);
|
22 | }
|
23 | }
|
24 | };
|
und der Anfang der Funktion die die Kommunikation übernehmen soll
1 | void I2CEMEMdrv(I2CEMEM_DRV *i2cMem)
|
2 | {
|
3 |
|
4 | static int state=0, cntr=0, rtrycntr=0;
|
5 |
|
6 | switch(state)
|
7 | {
|
8 | case 0:
|
9 | if( (i2cMem->cmd == I2C_WRITE) || (i2cMem->cmd == I2C_READ) )
|
10 | state=1;
|
11 |
|
12 | break;
|
13 |
|
14 | /*==================================*/
|
15 | /* Control/Address Phase */
|
16 | /*==================================*/
|
17 | case 1:
|
18 | // Start Condition
|
19 | I2C1CONbits.SEN=1;
|
20 | state=state+1;
|
21 | break;
|
22 |
|
23 |
|
24 | case 2:
|
25 | // Start Byte with device select id
|
26 | if(jDone==1) {
|
27 | jDone=0;
|
28 | state=state+1;
|
29 | I2C1TRN=(0x00A0)|(((i2cMem->oData->csel)&0x7)<<1);
|
30 | }
|
31 | break;
|
Muss ich noch irgend eine Library hinzufügen damit es funktioniert?
Den gesamten Code findet man unter Dokumentation und Software auf der
Microchip Seite!
Wenn jemand eine Idee hat wieso der Interrupt nicht ausgelöst wird wäre
ich sehr dankbar!
Grüße
Chris