4 * Copyright (C) 2013-06-10 K.Ohta <whatisthis.sowhat ai gmail.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2,
10 * or (at your option) any later version.
11 * This library / program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this library; see the file COPYING. If not, write to the
18 * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21 * As a special exception, if you link this(includeed from sdcc) library
22 * with other files, some of which are compiled with SDCC,
23 * to produce an executable, this library does not by itself cause
24 * the resulting executable to be covered by the GNU General Public License.
25 * This exception does not however invalidate any other reasons why
26 * the executable file might be covered by the GNU General Public License.
33 #include <pic18fregs.h>
40 #ifdef _I2C_IO_TWO_MSSPS
47 SSP1ADD = 19; // Fosc:8000[KHz] / (4 * I2C:Clock:100[KHz]) - 1
57 SSP2ADD = 4; // Fosc:8000[KHz] / (4 * I2C:Clock:400[KHz]) - 1
60 #ifdef _I2C_IO_ONE_MSSP
64 // b = _SSPEN | _SSPM3;
65 // SSPCON1bits.SSPEN = 1;
66 // SSPCON1bits.SSPM3 = 1;
67 // SSPADD = 4; // Fosc:8000[KHz] / (4 * I2C:Clock:400[KHz]) - 1
78 #else // None MSSP, Software I2C
87 void i2c_send_byte(unsigned char addr, unsigned char reg, unsigned char data)
90 i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
99 OpenI2C(MASTER, SLEW_ON);
103 while (SSPCON2bits.SEN);
105 while(SSPCON2bits.SEN);
107 while(SSPCON2bits.SEN);
110 while (SSPCON2bits.PEN);
112 #endif // i2c_idle();
115 unsigned char i2c_read_byte(unsigned char addr, unsigned char reg)
119 i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
127 i2c_writechar(addr | 1);
133 OpenI2C(MASTER, SLEW_ON);
136 while(SSPCON2bits.SEN);
139 while(SSPCON2bits.SEN);
146 if (!SSPCON2bits.ACKSTAT){
147 SSPCON2bits.RCEN = 1;
148 while(SSPCON2bits.RCEN);
150 while (SSPCON2bits.ACKEN);
152 while (SSPCON2bits.PEN);