Hallo Zusammen,
ich versuche bei einem SAMC20 MCU mittels des SERCOM1 I2C zu nutzen.
Der MCU soll als Master fungieren und es ist nur ein Slave am Bus.
Ich habe aber noch große Verständnissschwierigkeiten und hoffe hier auf
Hilfe.
Konfiguriert habe ich den SERCOM wie folgt:
1 | PORT->Group[0].PMUX[PIN_PA16/2].bit.PMUXE = MUX_PA16C_SERCOM1_PAD0;
|
2 | PORT->Group[0].PINCFG[PIN_PA16].bit.PMUXEN = 1;
|
3 | PORT->Group[0].PMUX[PIN_PA17/2].bit.PMUXO = MUX_PA17C_SERCOM1_PAD1;
|
4 | PORT->Group[0].PINCFG[PIN_PA17].bit.PMUXEN = 1;
|
5 |
|
6 | SERCOM1->I2CM.CTRLA.reg = SERCOM_I2CM_CTRLA_INACTOUT(0x0) | SERCOM_I2CM_CTRLA_SPEED(0x0) | SERCOM_I2CM_CTRLA_SDAHOLD(0x0) | SERCOM_I2CM_CTRLA_MODE(0x5);
|
7 | SERCOM1->I2CM.CTRLB.reg = SERCOM_I2CM_CTRLB_SMEN;
|
8 |
|
9 | static const uint32_t F_I2C = 100000;
|
10 | SERCOM1->I2CM.BAUD.bit.BAUD = to_uint8(32e6/(2*F_I2C)-1);
|
11 |
|
12 | SERCOM1->I2CM.CTRLA.bit.ENABLE = 1;
|
Nur wie schreibe und lese ich Register des Slaves?
Mir ist der Ablauf nicht ganz klar.
probiert habe ich folgendes:
1 | volatile uint8_t bla;
|
2 | SERCOM1->I2CM.ADDR.bit.ADDR = 0x1D;
|
3 | SERCOM1->I2CM.DATA.reg = 0x00;
|
4 | SERCOM1->I2CM.CTRLB.bit.CMD = SERCOM_I2CM_CTRLB_CMD(1);
|
5 | bla = SERCOM1->I2CM.DATA.reg;
|
funktionieren tut das Ganze aber nicht.
Kann mir bitte jemand auf die Sprünge helfen?
Vielen Dank,
Simon