chipKIT® Development Platform

Inspired by Arduino™

Accessing I2C EEPROM on Basic I/O shield?

Created Fri, 26 Sep 2014 13:37:20 +0000 by kestreltom


kestreltom

Fri, 26 Sep 2014 13:37:20 +0000

I am using a Max32 board with the Basic I/O shield to prototype a pwm vacuum actuator controller. The compiler is MPIDE ver. 0316 - the Chipkit hardware is new.

I am trying to resolve an EEPROM issue in which the sketch compiles and downloads successfully to the Max32 and most of the sketch runs fine, but when I attempt to save data to the EEPROM on the Basic IO shield nothing happens...

To help with debugging, I decided to load the IOShield_EEPROM_Demo that comes with the MPIDE package and downgraded MPIDE ver 0821 to ver 0316 because of known wire library issues. The demo sketch loads a sample ASCII file into the I2C EEPROM and reads it back on the serial port.

/* Note: For chipKit Max users you must manually 
** connect SDA and SCL pins(20 and 21) to pins A4 and A5 of 
** IO Shield 
**
** Note: For chipKit Uno Users you must have Jumpers JP6 and JP8 
** set in the RG3 and RG2 positions
*/

#include <IOShieldEEPROM.h>
#include <Wire.h>

void setup()
{
  char buf[26];
  char single;
  int i;
  Serial.begin(9600);
  
  //Write the alphabet to the EEPROM
  //The data length is assumed in this example because the data
  //is a string. If you write an array numbers to EEPROM then the
  //length of the array must be provided.
  IOShieldEEPROM.writeString(0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  
  //Read alphabet back and print to monitor
  IOShieldEEPROM.readString(0, buf, 26);
  Serial.print(buf);

  
  Serial.println();
  
  //Write a single character
  IOShieldEEPROM.write(20,'#');
  
  //Read all characters back
  IOShieldEEPROM.readString(0, buf, 26);
  Serial.print(buf);
  
  Serial.println();
  
  //Read back last letter
  single = IOShieldEEPROM.read(25);
  Serial.print(single);
}

void loop()
{
}

The code compiles and downloads to the Max32 without errors, but when I open Serial monitor / Putty, I get nothing... it is just blank.

I installed jumpers between pin 20 & 21 (SDA/SCL) on the Max32 and the SDA/SCL pins on J11 of the Basic IO shield. I have tried using the JP2 pullup jumpers supplied on the Basic IO, and I have also tried using 2k7 pullups on pins 20/21 of the Max32 . I have also tried connecting the jumpers to A4 & A5 on the Basic IO instead of the J11 pins to no avail. I do not think there is a hardware problem, because I have scoped the I2C clock and data pins and can see 0-3.3v pulses so I know that the I2C bus is functioning at least some of the time.

I also tried the supplied IOShield_Temp_Demo and have a similar issue, only in this case the serial monitor reads out " 0.00 C, 32.00 F " no matter how warm the ambient temperature is.

To help with debugging, I tried the following I2C scanner sketch:

/**
 * I2CScanner.pde -- I2C bus scanner for Arduino
 *
 * 2009, Tod E. Kurt, http://todbot.com/blog/
 *
 */

#include "Wire.h"
extern "C" { 
#include "utility/twi.h"  // from Wire library, so we can do bus scanning
}

// Scan the I2C bus between addresses from_addr and to_addr.
// On each address, call the callback function with the address and result.
// If result==0, address was found, otherwise, address wasn't found
// (can use result to potentially get other status on the I2C bus, see twi.c)
// Assumes Wire.begin() has already been called
void scanI2CBus(byte from_addr, byte to_addr, 
                void(*callback)(byte address, byte result) ) 
{
  byte rc;
  byte data = 0; // not used, just an address to feed to twi_writeTo()
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1);
    callback( addr, rc );
  }
}

// Called when address is found in scanI2CBus()
// Feel free to change this as needed
// (like adding I2C comm code to figure out what kind of I2C device is there)
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,HEX);
  Serial.print( (result==0) ? " found!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}


byte start_address = 1;
byte end_address = 127;

// standard Arduino setup()
void setup()
{
    delay(2000);
    Wire.begin();
    Serial.begin(9600);
    Serial.println("\nI2CScanner ready!");

    Serial.print("starting scanning of I2C bus from ");
    Serial.print(start_address,HEX);
    Serial.print(" to ");
    Serial.print(end_address,HEX);
    Serial.println("...Hex");

    // start the scan, will call "scanFunc()" on result from each address
    scanI2CBus( start_address, end_address, scanFunc );

    Serial.println("\ndone");
}

// standard Arduino loop()
void loop() 
{
    // Nothing to do here, so we'll just blink the built-in LED
    digitalWrite(13,HIGH);
    delay(300);
    digitalWrite(13,LOW);
    delay(300);
}

The above code compiles and runs fine, and the serial monitor shows the following:

I2CScanner ready! starting scanning of I2C bus from 1 to 7F...Hex addr: 1 found! addr: 2 found! addr: 3 found! addr: 4 found! addr: 5 found! addr: 6 found! addr: 7 found! addr: 8
addr: 9 addr: A addr: B addr: C
addr: D addr: E addr: F addr: 10
addr: 11 addr: 12 addr: 13 addr: 14
addr: 15 addr: 16 addr: 17 addr: 18
addr: 19 addr: 1A addr: 1B addr: 1C
addr: 1D addr: 1E addr: 1F addr: 20
addr: 21 addr: 22 addr: 23 addr: 24
addr: 25 addr: 26 addr: 27 addr: 28
addr: 29 addr: 2A addr: 2B addr: 2C
addr: 2D addr: 2E addr: 2F addr: 30
addr: 31 addr: 32 addr: 33 addr: 34
addr: 35 addr: 36 addr: 37 addr: 38
addr: 39 addr: 3A addr: 3B addr: 3C
addr: 3D addr: 3E addr: 3F addr: 40
addr: 41 addr: 42 addr: 43 addr: 44
addr: 45 addr: 46 addr: 47 addr: 48
addr: 49 addr: 4A addr: 4B addr: 4C
addr: 4D addr: 4E addr: 4F addr: 50
addr: 51 addr: 52 addr: 53 addr: 54
addr: 55 addr: 56 addr: 57 addr: 58
addr: 59 addr: 5A addr: 5B addr: 5C
addr: 5D addr: 5E addr: 5F addr: 60
addr: 61 addr: 62 addr: 63 addr: 64
addr: 65 addr: 66 addr: 67 addr: 68
addr: 69 addr: 6A addr: 6B addr: 6C
addr: 6D addr: 6E addr: 6F addr: 70
addr: 71 addr: 72 addr: 73 addr: 74
addr: 75 addr: 76 addr: 77 addr: 78
addr: 79 addr: 7A addr: 7B addr: 7C found! addr: 7D addr: 7E addr: 7F done

Is this is an I2C / wire library problem? Any ideas how to fix it?


tom21091

Tue, 19 Jan 2016 18:31:47 +0000

Hi kestreltom,

I found this post looking through old unanswered posts and figured I'd pick it up. Sorry you never got an answer. I understand that MPIDE was having problems with its Wire libraries back then. I figure a more recent version of MPIDE should fix this problem. Have you been able to get this to work since then?

Tommy


kestreltom

Tue, 19 Jan 2016 19:21:03 +0000

Thanks Tommy,

No, I never got an answer to my problem. I eventually deduced that my Chipkit board was defective, returned it, and moved on with an Arduino Uno. After the Uno, I tried various Chinese copies including Mega 2560 clones and have even better luck with them.


tom21091

Tue, 19 Jan 2016 19:44:07 +0000

Ah I'm sorry to hear that, but I understand. I think there were a lot of problems porting the Wire library over last year. I spent a lot of time battling with I2C on my chipKIT at the time. There's a much more robust TWI library (DTWI) that works now. I'm sorry you had so much trouble getting this to work. Since your departure, a lot of time has been put into fixing these libraries to make it as painless as possible.

Thanks for your response!

Tommy