00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "i2c.h"
00038 #include "pic_serial.h"
00039 #define DELAY_AMOUNT 10
00040
00041 void i2c_ack_polling(uns8 device_address)
00042 {
00043 while(test_pin(i2c_sda_port, i2c_sda_pin)!= 0)
00044 {
00045 i2c_start();
00046 i2c_send_byte(device_address);
00047 }
00048 i2c_stop();
00049 }
00050
00051 void i2c_write_eeprom(uns8 device_address, uns8 mem_address, uns8 data)
00052 {
00053
00054 i2c_start();
00055 i2c_send_byte(device_address);
00056
00057
00058 i2c_send_byte(mem_address);
00059 i2c_send_byte(data);
00060 i2c_stop();
00061 }
00062
00063 void i2c_write_eeprom_16bit(uns8 device_address, uns8 mem_address, uns16 data)
00064 {
00065
00066 i2c_start();
00067 i2c_send_byte(device_address);
00068
00069
00070 i2c_send_byte(mem_address);
00071 i2c_send_byte(data >> 8);
00072 i2c_send_byte(data & 0x00ff);
00073 i2c_stop();
00074 }
00075
00076 uns8 i2c_read_eeprom(uns8 device_address, uns8 mem_address)
00077 {
00078 uns8 data;
00079
00080
00081 i2c_start();
00082 i2c_send_byte(device_address);
00083
00084 i2c_send_byte(mem_address);
00085 i2c_stop();
00086
00087 i2c_start();
00088 i2c_send_byte(device_address | 0b00000001);
00089 data = i2c_receive_byte();
00090
00091
00092 clear_pin(i2c_scl_port, i2c_scl_pin);
00093 i2c_write_sda();
00094 delay_us(DELAY_AMOUNT);
00095 set_pin(i2c_sda_port, i2c_sda_pin);
00096 set_pin(i2c_scl_port, i2c_scl_pin);
00097 delay_us(DELAY_AMOUNT);
00098
00099 i2c_stop();
00100 return(data);
00101 }
00102
00103 uns16 i2c_read_eeprom_16bit(uns8 device_address, uns8 mem_address)
00104 {
00105 uns16 data;
00106
00107
00108 i2c_start();
00109 i2c_send_byte(device_address);
00110
00111 i2c_send_byte(mem_address);
00112
00113 i2c_start();
00114 i2c_send_byte(device_address | 0b00000001);
00115 data = i2c_receive_byte();
00116 i2c_write_sda();
00117
00118 clear_pin(i2c_scl_port, i2c_scl_pin);
00119 delay_us(DELAY_AMOUNT);
00120 clear_pin(i2c_sda_port, i2c_sda_pin);
00121 delay_us(DELAY_AMOUNT);
00122 set_pin(i2c_scl_port, i2c_scl_pin);
00123 delay_us(DELAY_AMOUNT);
00124
00125 data = data << 8 | i2c_receive_byte();
00126
00127
00128 clear_pin(i2c_scl_port, i2c_scl_pin);
00129 i2c_write_sda();
00130 delay_us(DELAY_AMOUNT);
00131 set_pin(i2c_sda_port, i2c_sda_pin);
00132 set_pin(i2c_scl_port, i2c_scl_pin);
00133 delay_us(DELAY_AMOUNT);
00134
00135 i2c_stop();
00136
00137 return(data);
00138 }
00139
00140 void i2c_send_ack(void) {
00141
00142 i2c_write_sda();
00143
00144 clear_pin(i2c_scl_port, i2c_scl_pin);
00145 delay_us(DELAY_AMOUNT);
00146 clear_pin(i2c_sda_port, i2c_sda_pin);
00147 delay_us(DELAY_AMOUNT);
00148 set_pin(i2c_scl_port, i2c_scl_pin);
00149 delay_us(DELAY_AMOUNT);
00150
00151
00152 }
00153
00154
00155 void i2c_start(void)
00156 {
00157
00158 clear_pin(i2c_scl_port, i2c_scl_pin);
00159 delay_us(DELAY_AMOUNT);
00160
00161 i2c_write_sda();
00162
00163 set_pin(i2c_sda_port, i2c_sda_pin);
00164 delay_us(DELAY_AMOUNT);
00165 set_pin(i2c_scl_port, i2c_scl_pin);
00166 delay_us(DELAY_AMOUNT);
00167 clear_pin(i2c_sda_port, i2c_sda_pin);
00168 delay_us(DELAY_AMOUNT);
00169 }
00170
00171 void i2c_stop(void)
00172 {
00173 clear_pin(i2c_scl_port, i2c_scl_pin);
00174 delay_us(DELAY_AMOUNT);
00175
00176 i2c_write_sda();
00177
00178 clear_pin(i2c_sda_port, i2c_sda_pin);
00179 delay_us(DELAY_AMOUNT);
00180 set_pin(i2c_scl_port, i2c_scl_pin);
00181 delay_us(DELAY_AMOUNT);
00182 set_pin(i2c_sda_port, i2c_sda_pin);
00183 delay_us(DELAY_AMOUNT);
00184 }
00185
00186 uns8 i2c_receive_byte(void)
00187 {
00188 uns8 count, in_byte;
00189
00190 clear_pin(i2c_scl_port, i2c_scl_pin);
00191
00192 i2c_read_sda();
00193 for(count = 0 ; count < 8 ; count++)
00194 {
00195 clear_pin(i2c_scl_port, i2c_scl_pin);
00196 delay_us(DELAY_AMOUNT);
00197 set_pin(i2c_scl_port, i2c_scl_pin);
00198 delay_us(DELAY_AMOUNT);
00199
00200 in_byte = in_byte << 1;
00201 in_byte.0 = test_pin(i2c_sda_port, i2c_sda_pin);
00202 }
00203 return(in_byte);
00204 }
00205
00206 void i2c_send_byte(uns8 data)
00207 {
00208 uns8 count;
00209
00210 clear_pin(i2c_scl_port, i2c_scl_pin);
00211 i2c_write_sda();
00212
00213 for( count = 0 ; count < 8 ; count++ )
00214 {
00215 clear_pin(i2c_scl_port, i2c_scl_pin);
00216 change_pin(i2c_sda_port, i2c_sda_pin, data.7);
00217 data = data << 1;
00218 delay_us(DELAY_AMOUNT);
00219 set_pin(i2c_scl_port, i2c_scl_pin);
00220 delay_us(DELAY_AMOUNT);
00221 }
00222
00223
00224 clear_pin(i2c_scl_port, i2c_scl_pin);
00225 i2c_read_sda();
00226 delay_us(DELAY_AMOUNT);
00227 set_pin(i2c_scl_port, i2c_scl_pin);
00228 delay_us(DELAY_AMOUNT);
00229 }
00230
00231 void i2c_setup_io() {
00232 make_output(i2c_scl_port, i2c_scl_pin);
00233 make_input(i2c_sda_port, i2c_sda_pin);
00234 }