een lange titel

I2C op Raspberry Pi vanuit C

Vanuit een C programma kan je hardware aanspreken die via de I2C bus gekoppeld is met de Raspberry Pi.

De eerste stap is een update.

apt-get update
apt-get upgrade

Hierna worden de i2c-tools geïnstalleerd.

apt-get install i2c-tools

Om ervoor te zorgen dat I2C ondersteund wordt na reboot, wordt dit ingesteld met raspi-config. Deze schrijft dan deze regel in /boot/config.txt:

dtparam=i2c_arm=on

Dit zijn dan de geladen modules. Het kan wel zijn dat i2c_dev nog manueel geladen moet worden.

Module                  Size  Used by
i2c_dev                 5295  0 
evdev                   8678  2 
i2c_bcm2708             3678  0 
i2c_core               24407  2 i2c_bcm2708,i2c_dev

Dit zijn dan de I2C devices. Deze devices moeten er zijn opdat i2cdetect zou werken.

crw-rw---T 1 root i2c 89, 0 Jun 27 09:32 /dev/i2c-0                                                                                                                                                            
crw-rw---T 1 root i2c 89, 1 Jun 27 09:32 /dev/i2c-1                                                                                                                                                            

De driver is geregistreerd onder nummer 89.

cat /proc/devices                                                                                                                                                                    
Character devices:                                                                                                                                                                                             
 89 i2c   

Nu kan de detectie gebeuren. Er is een PCF8574P gebruikt. Dit is nog een oude component uit het TTL tijdperk. En bijgevolg vraagt die nog 5V, dus voeden met 5V.

# i2cdetect -l
i2c-0   i2c             bcm2708_i2c.0                           I2C adapter
i2c-1   i2c             bcm2708_i2c.1                           I2C adapter

Dit komt overeen met de /dev devices. De detectie van de adressen levert dit op:

# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

Het adres van de PCF8574P is zo opgebouwd:

+--+--+--+--+--+--+--+
| 0| 1| 0| 0|A2|A1|A0|
+--+--+--+--+--+--+--+

Als alle A ingangen 0 gemaakt wordt, klopt dit.

Er wordt een leestest uitgevoerd met wiringPi (http://wiringpi.com/). Deze bibliotheek wordt eerst geïnstalleerd.

git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

Het volgende testprogramma voert een read van 1 byte uit.

#include <stdio.h>
#include <wiringPi.h>

int main()
{
   printf("test read i2c\n");
   int fd = wiringPiI2CSetup(0x21);

   int val = wiringPiI2CRead(fd);
   printf("read val %x\n", val);

   return 0;
}

Dit is de Makefile:

all: readi2c

readi2c: readi2c.o
        gcc -o readi2c readi2c.o -lwiringPi

readi2c.o: readi2c.c
        gcc -c readi2c.c

Bij een read met zwevende ingangen wordt een 0xff teruggelezen. Wanneer een ingangspin met GND verbonden wordt, wordt een 0 teruggelezen.

Dit is pinlayout van de PCF8574P.

     A0 1 u 16 VDD 5V
     A1 2   15 SDA 
     A2 3   14 SCL
     P0 4   13 /INT
     P1 5   12 P7
     P2 6   11 P6
     P3 7   10 P5
GND VSS 8    9 P4