Renesas Rx, starta IIC - Mayday!

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Renesas Rx, starta IIC - Mayday!

Inlägg av Icecap »

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:

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
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.
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Renesas Rx, starta IIC - Mayday!

Inlägg av mri »

Om Rx är baserad på samma I2C soppa som finns i R8C kan jag bara önska dig lycka till. Själv gav jag upp efter 1-2 veckors kvällspyssel och implementerade istället helt i sw.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Renesas Rx, starta IIC - Mayday!

Inlägg av Icecap »

mri: uppmuntrande ord! :humm:

Men jag har faktisk bestämt mig för att om inte jag får liv i det idag får det bli bit-bang imorgon, sedan får jag lösa det eftersom med hårdvaran när jag har köpt mig lite tid.

Men du har rätt: det är inte speciellt enkelt! Renesas må göra hyggliga µC men de är dåliga på att skriva bra datablad - och ja, informationen finns men kan vara skitsvår att hitta - och deras AN är alla baserat på deras RTOS, inget finns för vi "hårdingar" som börjar från grunden.

Nåja, det är bara att jobba på, nu kan jag iaf. "wiggla" SCL & SDA så det syns på oscilloskopet via en skrivning till ett register så något liv finns...

EDIT: Jag har kanske fått lite liv i det hela! Kanske! Jag ändrade modet från Master till Slave i RIIC0.ICCR2.BYTE (= 0x00;) varefter jag rent faktisk får reaktion på pinnarna. Nu ska jag kolla interrupten och se vad som händer...
Skriv svar