Renesas Rx, starta IIC - Mayday!
Postat: 12 mars 2014, 11:09:22
Jag försöker få igång IIC-bussen på den Rx jag håller på med men kan bara stånga mig blodig. Jag har ganska klart översett något så om någon har en initiering som fungerar skulle jag bli mycket tacksam för en inblick.
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:
Interrupt, timeout osv. använd inte just nu, innan jag kan sparka igång skiten lär det inte hända heller.
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.
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.