chipKIT® Development Platform

Inspired by Arduino™

I2C Slave.

Created Thu, 18 Feb 2016 10:52:15 +0000 by keithsloan52


keithsloan52

Thu, 18 Feb 2016 10:52:15 +0000

I am trying to setup the chipKIT Pi as an I2C Slave to the Raspberry Pi

But when I load the following sketch

/ Simple I2C protocol for Arduino
// Slave side program
// (c) 2014 Ignas Gramba
//
#include <Wire.h>
 
#define XSensorPin 2
#define YSensorPin 3
 
const byte SlaveDeviceId = 22;
byte LastMasterCommand = 0;
 
void setup(){
  Wire.begin(SlaveDeviceId);      // join i2c bus with Slave ID
  Wire.onReceive(receiveCommand); // register talk event
  Wire.onRequest(slavesRespond);  // register callback event
 
  pinMode(XSensorPin, INPUT);
  pinMode(YSensorPin, INPUT);
}
 
void loop(){
  delay(100);
}
 
void receiveCommand(int howMany){
  LastMasterCommand = Wire.read(); // 1 byte (maximum 256 commands)
}
 
void slavesRespond(){
 
  int returnValue = 0;
 
  switch(LastMasterCommand){
    case 0:   // No new command was received
      Wire.write("NA");
    break;
    
    case 1:   // Return X sensor value
      returnValue = GetXSensorValue();
    break;
 
    case 2:   // Return Y sensor value
      returnValue = GetYSensorValue();
    break;
    
  }
 
  byte buffer[2];                 // split int value into two bytes buffer
  buffer[0] = returnValue >> 8;
  buffer[1] = returnValue & 255;
  Wire.write(buffer, 2);          // return response to last command
  LastMasterCommand = 0;          // null last Master's command
}
 
int GetXSensorValue(){
  int val = analogRead(XSensorPin);
  return val;
}
 
int GetYSensorValue(){
  int val = analogRead(YSensorPin);
  return val;
}

And then run i2cdetect -y 1 on the Raspberry Pi I get

pi@pi-three:~/chipKITPi $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77

Which I am advised means I probably have a wiring error.

I have SDA on the Pi going to TDO/RBP9/SDA1 pin 18 on the PICmx250f128B and SCL on the Pi going to TCK/RBP8/SCL1 pin 17 on the PIC


majenko

Thu, 18 Feb 2016 11:02:58 +0000

Do you have pullup resistors on the I2C lines?


keithsloan52

Thu, 18 Feb 2016 15:50:05 +0000

Do you have pullup resistors on the I2C lines?

The Raspberry Pi has pull up resistors on the SCL & SDA lines so I was assuming I did not need extra.

Did not need extra when I attached an SF08 ultrasonic distance detector to the same setup and that worked just fine.


majenko

Thu, 18 Feb 2016 16:00:30 +0000

Ok. In general internal pullups are frowned upon for I2C since they are normally about 10x the resistance that I2C is supposed to use. Still, they work most of the time for simple 1:1 or 1:2 usage.


keithsloan52

Thu, 18 Feb 2016 16:51:12 +0000

Ok. In general internal pullups are frowned upon for I2C since they are normally about 10x the resistance that I2C is supposed to use. Still, they work most of the time for simple 1:1 or 1:2 usage.

Don't believe they are internal, they are just already there on the Raspberry Pi PCB for SDA & SDL. I think they are both 1.8K from memory,