I'm new to PIC's and PIC programming but I'm working on a little project to try to get a PIC24F32KA301 communicating with a Raspberry Pi using I2C. The Raspberry Pi is the master and the PIC is the slave. I have created a little Python program on the Raspberry Pi and tested that it works by successfully communicating with an Arduino, what I want to do now is replace the Arduino with a PIC.

Just for completeness I've included the python program below:

import smbus
import time

bus = smbus.SMBus(1)
address = 0x22

def writeNumber(value):
    bus.write_byte(address, value)
    return -1

def readNumber():
    number = bus.read_byte(address)
    return number

while True:
    var = input("Enter 1 - 9: ")
    if not var:
    print "RPI: Hi Arduino, I sent you ", var

    number = readNumber()
    print "Arduino: Hey RPI, I received a digit ", number

I'm pretty sure I've connected the PIC and Raspberry Pi correctly:

GND <---> Vss (pin 19)
SCL <---> SCL1 (pin 12)
SDA <---> SDA1 (pin 13)

The Raspberry Pi is powered over USB (I think it's 5V, but it might be 3V) and the PIC is powered separately using a 3V battery. The Arduino didn't have any pull up resistors so I assume it's ok to not have any on the PIC (maybe this is wrong?).

I'm using C with the XC16 compiler and the i2c.h library to program the PIC but I'm not really sure what I'm doing, I've tried my best to piece things together from I2C examples and little bits I've read on various forums etc:

#define USE_AND_OR    // not sure what this is!
#include <p24Fxxxx.h>
#include <i2c.h>

unsigned char I2C_RECV[1]

void main(void) {
    unsigned int temp, i;
    for(i=0; i<1; i++)

    TRISA = 0b0000000000000000;
    PORTA = 0b0000000000000001;

    CloseI2C1();                            // close i2c if it was operating earlier

    while(1) {
        OpenI2C1((I2C_ON | I2C_7BIT_ADD | I2C_CLK_REL | I2C_STR_EN), 0);
        I2C1ADD = 0x22;                     // initialze slave address to 1E

        // receive data from master
        while(DataRdyI2C1() == 0);          // wait until data is transmitted from master
        temp = SlaveReadI2C1();             // read address to empty buffer

        SlavegetsI2C1(I2C_RECV, 1);         // receive data

        if(I2C_RECV[0] == 9) {
            PORTA = 0b0000000000000011;


The code is quite simple (but probably wrong!). Basically I initialise the I2C module and turn on an LED, then I enter a loop, open the I2C connection using address 0x22 and wait for the master to send some data. When data is received I check it's value, if it's 9 I turn on another LED.

On the Raspberry Pi I can confirm that the PIC is accessible by running i2cdetect -y 1. I can see the PIC at address 0x22, which gives me some confidence that I'm at least heading in the right direction! However, when I run the python program I receive an IO error, the error number is 5. I've looked around to find out what that means, but it's a very vague error, basically anything could have gone wrong!

I'm not sure if it's my circuit that's incorrect (i.e. do I need pull up resistors, if so how do I calculate what resistance they need to be?) or my PIC program. If anyone can check the program makes sense or has any advice I'd be very grateful.

I have a hard time believing this is a serious question given I found exactly the same question on Microchip's forums (first posted four years ago), but there's a link that has a partial solution to the problem in case anybody goes looking for solutions to a similar issue.
I was wondering why exactly you are wanting to interface with the PIC from a RPi? Will it be running a specific peripheral or is it just for the sake of learning?

What version RPi are you using?
Register to Join the Conversation
Have your own thoughts to add to this or any other topic? Want to ask a question, offer a suggestion, share your own programs and projects, upload a file to the file archives, get help with calculator and computer programming, or simply chat with like-minded coders and tech and calculator enthusiasts via the site-wide AJAX SAX widget? Registration for a free Cemetech account only takes a minute.

» Go to Registration page
Page 1 of 1
» All times are GMT - 5 Hours
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum