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