00001 #include "i2c.h"
00002 #include "pic_serial.h"
00003 #define DELAY_AMOUNT 50
00004
00005 void i2c_ack_polling(uns8 device_address)
00006 {
00007 while(test_pin(i2c_sda_port, i2c_sda_pin)!= 0)
00008 {
00009 i2c_start();
00010 i2c_send_byte(device_address);
00011 }
00012 i2c_stop();
00013 }
00014
00015 void i2c_write_eeprom(uns8 device_address, uns8 mem_address, uns8 data)
00016 {
00017
00018 i2c_start();
00019 i2c_send_byte(device_address);
00020
00021
00022 i2c_send_byte(mem_address);
00023 i2c_send_byte(data);
00024 i2c_stop();
00025 }
00026
00027 uns8 i2c_read_eeprom(uns8 device_address, uns8 mem_address)
00028 {
00029 uns8 data;
00030
00031
00032 i2c_start();
00033 i2c_send_byte(device_address);
00034
00035 i2c_send_byte(mem_address);
00036 i2c_stop();
00037
00038 i2c_start();
00039 i2c_send_byte(device_address | 0b00000001);
00040 data = i2c_receive_byte();
00041
00042
00043 clear_pin(i2c_scl_port, i2c_scl_pin);
00044 i2c_write_sda();
00045 delay_us(DELAY_AMOUNT);
00046 set_pin(i2c_sda_port, i2c_sda_pin);
00047 set_pin(i2c_scl_port, i2c_scl_pin);
00048 delay_us(DELAY_AMOUNT);
00049
00050 i2c_stop();
00051
00052 return(data);
00053 }
00054
00055 uns16 i2c_read_eeprom_16bit(uns8 device_address, uns8 mem_address)
00056 {
00057 uns16 data;
00058
00059
00060
00061 i2c_start();
00062 i2c_send_byte(device_address);
00063
00064 i2c_send_byte(mem_address);
00065 i2c_stop();
00066
00067 i2c_start();
00068 i2c_send_byte(device_address | 0b00000001);
00069 data = i2c_receive_byte();
00070 i2c_write_sda();
00071
00072 clear_pin(i2c_scl_port, i2c_scl_pin);
00073 delay_us(DELAY_AMOUNT);
00074 clear_pin(i2c_sda_port, i2c_sda_pin);
00075 delay_us(DELAY_AMOUNT);
00076 set_pin(i2c_scl_port, i2c_scl_pin);
00077 delay_us(DELAY_AMOUNT);
00078
00079 data = data << 8 | i2c_receive_byte();
00080
00081
00082 clear_pin(i2c_scl_port, i2c_scl_pin);
00083 i2c_write_sda();
00084 delay_us(DELAY_AMOUNT);
00085 set_pin(i2c_sda_port, i2c_sda_pin);
00086 set_pin(i2c_scl_port, i2c_scl_pin);
00087 delay_us(DELAY_AMOUNT);
00088
00089 i2c_stop();
00090
00091 return(data);
00092 }
00093
00094
00095 void i2c_start(void)
00096 {
00097 i2c_write_sda();
00098
00099 delay_us(DELAY_AMOUNT);
00100
00101 clear_pin(i2c_sda_port, i2c_sda_pin);
00102 delay_us(DELAY_AMOUNT);
00103 }
00104
00105 void i2c_stop(void)
00106 {
00107 clear_pin(i2c_scl_port, i2c_scl_pin);
00108 delay_us(DELAY_AMOUNT);
00109
00110 i2c_write_sda();
00111
00112 clear_pin(i2c_sda_port, i2c_sda_pin);
00113 delay_us(DELAY_AMOUNT);
00114 set_pin(i2c_scl_port, i2c_scl_pin);
00115 delay_us(DELAY_AMOUNT);
00116 set_pin(i2c_sda_port, i2c_sda_pin);
00117 delay_us(DELAY_AMOUNT);
00118 }
00119
00120 uns8 i2c_receive_byte(void)
00121 {
00122 uns8 count, in_byte;
00123
00124 clear_pin(i2c_scl_port, i2c_scl_pin);
00125
00126 i2c_read_sda();
00127
00128 for(count = 0 ; count < 8 ; count++)
00129 {
00130 clear_pin(i2c_scl_port, i2c_scl_pin);
00131 delay_us(DELAY_AMOUNT);
00132 set_pin(i2c_scl_port, i2c_scl_pin);
00133 delay_us(DELAY_AMOUNT);
00134
00135 in_byte = in_byte << 1;
00136 in_byte.0 = test_pin(i2c_sda_port, i2c_sda_pin);
00137 }
00138
00139 return(in_byte);
00140 }
00141
00142 void i2c_send_byte(uns8 data)
00143 {
00144 uns8 count;
00145
00146 i2c_write_sda();
00147
00148 for( count = 0 ; count < 8 ; count++ )
00149 {
00150 clear_pin(i2c_scl_port, i2c_scl_pin);
00151 change_pin(i2c_sda_port, i2c_sda_pin, data.7);
00152 data = data << 1;
00153 delay_us(DELAY_AMOUNT);
00154 set_pin(i2c_scl_port, i2c_scl_pin);
00155 delay_us(DELAY_AMOUNT);
00156 }
00157
00158
00159 clear_pin(i2c_scl_port, i2c_scl_pin);
00160 i2c_read_sda();
00161 delay_us(DELAY_AMOUNT);
00162 set_pin(i2c_scl_port, i2c_scl_pin);
00163 }
00164
00165 void i2c_setup() {
00166 make_output(i2c_scl_port, i2c_scl_pin);
00167 }