00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <avr/io.h>
00019
00020 #include "i2csw.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #define QDEL asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop");
00031
00032 #define HDEL asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop");
00033
00034 #define I2C_SDL_LO cbi( SDAPORT, SDA)
00035 #define I2C_SDL_HI sbi( SDAPORT, SDA)
00036
00037 #define I2C_SCL_LO cbi( SCLPORT, SCL);
00038 #define I2C_SCL_HI sbi( SCLPORT, SCL);
00039
00040 #define I2C_SCL_TOGGLE HDEL; I2C_SCL_HI; HDEL; I2C_SCL_LO;
00041 #define I2C_START I2C_SDL_LO; QDEL; I2C_SCL_LO;
00042 #define I2C_STOP HDEL; I2C_SCL_HI; QDEL; I2C_SDL_HI; HDEL;
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 UINT i2cPutbyte(u08 b)
00067 {
00068 int i;
00069
00070 for (i=7;i>=0;i--)
00071 {
00072 if ( b & (1<<i) )
00073 I2C_SDL_HI;
00074 else
00075 I2C_SDL_LO;
00076 I2C_SCL_TOGGLE;
00077 }
00078
00079 I2C_SDL_HI;
00080
00081 cbi(SDADDR, SDA);
00082 HDEL;
00083 I2C_SCL_HI;
00084 b = inp(SDAPIN) & (1<<SDA);
00085
00086 HDEL;
00087 I2C_SCL_LO;
00088 sbi(SDADDR, SDA);
00089 HDEL;
00090 return (b == 0);
00091 }
00092
00093
00094 u08 i2cGetbyte(UINT last)
00095 {
00096 int i;
00097 u08 c,b = 0;
00098
00099 I2C_SDL_HI;
00100 cbi(SDADDR, SDA);
00101
00102 for(i=7;i>=0;i--)
00103 {
00104 HDEL;
00105 I2C_SCL_HI;
00106 c = inp(SDAPIN) & (1<<SDA);
00107 b <<= 1;
00108 if(c) b |= 1;
00109 HDEL;
00110 I2C_SCL_LO;
00111 }
00112
00113 sbi(SDADDR, SDA);
00114
00115 if (last)
00116 I2C_SDL_HI;
00117 else
00118 I2C_SDL_LO;
00119
00120 I2C_SCL_TOGGLE;
00121 I2C_SDL_HI;
00122 return b;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131 void i2cInit(void)
00132 {
00133 sbi( SDADDR, SDA);
00134 sbi( SCLDDR, SCL);
00135 I2C_SDL_HI;
00136 I2C_SCL_HI;
00137 }
00138
00139
00140 void i2cSend(u08 device, u08 subAddr, u08 length, u08 *data)
00141 {
00142 I2C_START;
00143 i2cPutbyte(device);
00144 i2cPutbyte(subAddr);
00145
00146
00147 while (length--)
00148 i2cPutbyte(*data++);
00149
00150 I2C_SDL_LO;
00151 I2C_STOP;
00152 }
00153
00154
00155 void i2cReceive(u08 device, u08 subAddr, u08 length, u08 *data)
00156 {
00157 int j = length;
00158 u08 *p = data;
00159
00160 I2C_START;
00161 i2cPutbyte(device);
00162 i2cPutbyte(subAddr);
00163 HDEL;
00164 I2C_SCL_HI;
00165 I2C_START;
00166
00167 i2cPutbyte(device | READ);
00168
00169
00170 while (j--)
00171 *p++ = i2cGetbyte(j == 0);
00172
00173 I2C_SDL_LO;
00174 I2C_STOP;
00175 }
00176