00001
00002
00003
00004
00009 #include "piccolo_config.h"
00010 #include "piccolo_i2c.h"
00011
00016 void i2c_init(unsigned int bitrate_kHz) {
00017 #define clk_tmp CLOCK_FREQ/4000L
00018 SSPADD = clk_tmp/bitrate_kHz -1;
00019 SSPSTAT = SLEW_OFF | SMBUS_DISABLE;
00020 SSPCON1 = MASTER;
00021 SSPCON2 = 0x00;
00022 I2C_SCL = 1;
00023 I2C_SDA = 1;
00024 SSPCON1 |= SSPENB;
00025 }
00026
00033 uint8 i2c_getc(uint8 ack2send) {
00034 i2c_idle();
00035 SSPCON2bits.RCEN = 1;
00036 while ( !SSPSTATbits.BF );
00037 i2c_ack(ack2send);
00038 return ( SSPBUF );
00039 }
00040
00045 uint8 i2c_putc(uint8 data) {
00046 SSPBUF = data;
00047 while( SSPSTATbits.BF );
00048 i2c_idle();
00049 return ( SSPCON2bits.ACKSTAT );
00050 }
00051
00056 void i2c_write1(uint8 addr,uint8 data) {
00057 i2c_start();
00058 i2c_putc(addr & 0xFE);
00059 i2c_putc(data);
00060 i2c_stop();
00061 }
00062
00068 void i2c_write2(uint8 addr,uint8 d1, uint8 d2) {
00069 i2c_start();
00070 i2c_putc(addr & 0xFE);
00071 i2c_putc(d1);
00072 i2c_putc(d2);
00073 i2c_stop();
00074 }
00075
00081 void i2c_writeN(uint8 addr, uint8* data, uint8 cnt) {
00082 uint8 i;
00083 i2c_start();
00084 i2c_putc(addr & 0xFE);
00085 for (i=0; i < cnt; i++) {
00086 i2c_putc(*data);
00087 data++;
00088 }
00089 i2c_stop();
00090 }
00091
00097 void i2c_read1(uint8 addr,uint8* p1) {
00098 i2c_start();
00099 i2c_putc(addr | 0x01);
00100 *p1 = i2c_getc(I2C_NAK);
00101 i2c_stop();
00102 }
00103
00111 void i2c_read2(uint8 addr,uint8* p1, uint8* p2) {
00112 i2c_start();
00113 i2c_putc(addr | 0x01);
00114 *p1 = i2c_getc(I2C_ACK);
00115 *p2 = i2c_getc(I2C_NAK);
00116 i2c_stop();
00117 }
00118
00126 void i2c_readN(uint8 addr,uint8* p1, uint8 cnt) {
00127 uint8 i;
00128 i2c_start();
00129 i2c_putc(addr | 0x01);
00130 for (i=0; i < cnt; i++) {
00131 if(i != cnt-1) *p1 = i2c_getc(I2C_ACK);
00132 else *p1 = i2c_getc(I2C_NAK);
00133 p1++;
00134 }
00135 i2c_stop();
00136 }
00137
00138
00139
00140
00141
00142
00143
00144