Själva kommunikationen kan jag nog få klar utan allt för stora besvär men med den initiering jag gör får jag ingen reaktion när jag försöker att skapa en start-condition, det verkar helt enkelt som att själva periferenheten inte är igång.
Såhär gör jag för tillfället:
Kod: Markera allt
SYSTEM.PRCR.WORD = 0xA502; // Open the lock
MSTP(RIIC0) = 0; // Power up RIIC0 by turning off the Power-Down function
SYSTEM.PRCR.WORD = 0xA500; // Lock up again
IIC_SDA_D = USED_AS_OUTPUT; // Set port pin direction
IIC_SCL_D = USED_AS_OUTPUT; // Set port pin direction
IIC_SDA_F = true; // Use port pin as alternate function, i.e. IIC SDA
IIC_SCL_F = true; // Use port pin as alternate function, i.e. IIC SCL
sprintf(Buffer, "IIC shutdown: %u\r\n", MSTP(RIIC0)); RS232_B_Send_Buffer((_UBYTE*)Buffer);
// Start resetting
RIIC0.ICCR1.BIT.ICE = false; // Clear ICE in ICCR1
RIIC0.ICCR1.BIT.IICRST = true; // Set IICRST in ICCR1
RIIC0.ICCR1.BIT.ICE = true; // Set ICE in ICCR1, internal reset
RIIC0.ICCR1.BIT.IICRST = false; // Release from stop, TEST ONLY
RIIC0.ICMR1.BIT.MTWP = true;
RIIC0.ICCR2.BYTE = 0x40; // 01000000 Set to master
RIIC0.ICMR1.BIT.MTWP = false;
// Set transmission speed to 400kHz
RIIC0.ICBRH.BYTE = 0xE7; // High time set
RIIC0.ICBRL.BYTE = 0xF0; // Low time set
RIIC0.ICSER.BYTE = 0x00; // 00000000
// Set timeout operation (if needed)
// See page 1020
// Invalidate slave address detection
RIIC0.ICSER.BYTE = 0x00; // 00000000
RIIC0.ICFER.BYTE = 0x72; // 0x60; // 01100000
RIIC0.ICIER.BYTE = 0x00; // 00000000 Interrupt enables
RIIC0.ICMR1.BYTE = 0x00; // 00000000
RIIC0.ICMR2.BYTE = 0x00; // 00000??0
RIIC0.ICMR3.BYTE = 0x10; // 00010000 ??
RIIC0.ICSR1.BYTE = 0x00;
RIIC0.ICSR2.BYTE = 0x00;
sprintf(Buffer, "IIC ICCR1: %02Xh\r\nIIC ICCR2: %02Xh\r\n", RIIC0.ICCR1.BYTE, RIIC0.ICCR2.BYTE); RS232_B_Send_Buffer((_UBYTE*)Buffer);
sprintf(Buffer, "IIC ICMR1: %02Xh\r\nIIC ICMR2: %02Xh\r\nIIC ICMR3: %02Xh\r\n", RIIC0.ICMR1.BYTE, RIIC0.ICMR2.BYTE, RIIC0.ICMR3.BYTE); RS232_B_Send_Buffer((_UBYTE*)Buffer);
sprintf(Buffer, "IIC ICBRH: %02Xh\r\nIIC ICBRL: %02Xh\r\n", RIIC0.ICBRH.BYTE, RIIC0.ICBRL.BYTE); RS232_B_Send_Buffer((_UBYTE*)Buffer);
sprintf(Buffer, "IIC ICFER: %02Xh\r\nIIC ICSER: %02Xh\r\nIIC ICIER: %02Xh\r\n", RIIC0.ICFER.BYTE, RIIC0.ICSER.BYTE, RIIC0.ICIER.BYTE); RS232_B_Send_Buffer((_UBYTE*)Buffer);
MPC.PWPR.BYTE = 0x00; // Start allowing writing EDIT: Hade glömt
MPC.PWPR.BYTE = 0x40; // Allow writing to MPC-registers EDIT: Hade glömt
MPC.P12PFS.BYTE = 0x0F; // Select alt. function as SCL
MPC.P13PFS.BYTE = 0x0F; // Select alt. function as SDA
MPC.PWPR.BYTE = 0x80; // Shut down writing to MPC-registers EDIT: Hade glömt
IIC_SDA_F = true; // Use port pin as alternate function, i.e. IIC SDA
IIC_SCL_F = true; // Use port pin as alternate function, i.e. IIC SCL
Jag har en knapp som tillåter mig att jag kan trycka och sedan ska den utföra:
RIIC0.ICCR2.BIT.ST = true/false; Den växlar mellan true & false varannan gång.
Jag skriver ut RIIC0.ICCR2.BYTE och bit'en växlar som den ska men ingen reaktion sker på själva busspinnarna.
Jag känner att jag har stångad pannan in i samma ställe på muren så om någon har tips om ett annat ställa att dunka pannan mot ville det hjälpa mig mycket (hoppas jag). I nödfall får jag bygga en bit-bang-funktion men det känns inte speciellt kul, detta ska ju lösas ändå.
Och nej, att tipsa mig om ett RTOS är inte lösningen! Har kollat och förkastat!
EDIT: Hittade lite knas som hindrade att rätt alternativ funktion blev vald på pinnarna. Koden ovan är uppdaterat och jag kan nu, från min tryckknapp-rutin, styra nivån på SCL och SDA. Dock har "Make Start" ingen funktionalitet fortfarande.