Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // maple's i2c lib
- // run against i2c eeprom 24LC128 5ms write cycle, 400KHz max
- // http://ww1.microchip.com/downloads/en/devicedoc/21191m.pdf
- // write 1, read 1
- // I2C2 sda,scl PB11,PB10 D30,D29 need pullups
- /*
- * does maple wire lib enable pullups? left in ground rail
- * grnd 1 5 3.3v circle 1 left notch at top
- * grnd 2 6 grnd or float
- * grnd 3 7 SCL maple 29 4.7K pullup
- * grnd 4 8 SDA maple 30 4.7K pullup
- */
- #include "i2c.h"
- #define I2CID (0xA0 >> 1)
- void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
- int32 i,err1;
- i2c_msg msgs[1]; // one command
- uint8 msg_data[128];
- msg_data[0] = ((int)(eeaddresspage >> 8)); // MSB
- msg_data[1] = ((int)(eeaddresspage & 0xFF)); // LSB
- for(i=0;i<length;i++) {
- msg_data[i+2] = data[i];
- }
- msgs[0].addr = deviceaddress;
- msgs[0].flags = 0; // write
- msgs[0].length = length + 2; // address and data
- msgs[0].data = msg_data;
- err1=i2c_master_xfer(I2C2, msgs, 1,50); // 1 command 50ms timeout
- }
- void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte* data, byte length ) {
- int32 err1;
- i2c_msg msgs[2]; // addr command, read command
- uint8 msg_data[2];
- msg_data[0] = ((int)(eeaddress >> 8)); // MSB
- msg_data[1] = ((int)(eeaddress & 0xFF)); // LSB
- msgs[0].addr = deviceaddress;
- msgs[0].flags = 0; // write addr
- msgs[0].length = 2 ;
- msgs[0].data = msg_data;
- msgs[1].addr = deviceaddress;
- msgs[1].flags = I2C_MSG_READ; // read
- msgs[1].length = length ;
- msgs[1].data = data;
- err1=i2c_master_xfer(I2C2, msgs, 2,50); // 2 commands 50ms timeout
- if(err1 != 0) {
- if (err1 == I2C_ERROR_PROTOCOL) {
- SerialUSB.print("Protocol Error Occurred, ");
- }
- else if(err1 == I2C_ERROR_TIMEOUT) {
- SerialUSB.print("Timeout Occurred, ");
- }
- SerialUSB.print("State currently: ");
- SerialUSB.print(I2C2->state,HEX);
- SerialUSB.print(", Error flags: ");
- SerialUSB.println(I2C2->error_flags,HEX);
- // Attempts to recover
- //delayMicroseconds(5);
- //i2c_bus_reset(I2C2);
- //i2c_master_enable(I2C2, I2C_BUS_RESET);
- i2c_disable(I2C2);i2c_master_enable(I2C2, 0);
- }
- }
- void setup(){
- byte buff[64];
- int i;
- unsigned int t;
- i2c_master_enable(I2C2, 0); // 100KHz or I2C_FAST_MODE 400 khz
- while(!SerialUSB.available() ) {
- SerialUSB.println("hit a key");
- delay(1500);
- }
- SerialUSB.read();
- for(i=0;i< sizeof(buff); i++) buff[i]=i+100;
- t=micros();
- i2c_eeprom_write_page(I2CID, 128, buff, sizeof(buff));
- t=micros()-t;
- delay(10); // time for write to finish, errors otherwise
- SerialUSB.print("blk write ");
- SerialUSB.println(t,DEC);
- }
- void loop(){
- unsigned int t;
- byte buff[64];
- t=micros();
- i2c_eeprom_read_buffer(I2CID, 0,buff,sizeof(buff));
- t=micros()-t;
- SerialUSB.print("blk read ");
- SerialUSB.println(t,DEC);
- SerialUSB.println((char)buff[1]);
- SerialUSB.println((char)buff[2]);
- i2c_eeprom_read_buffer(I2CID, 128,buff,sizeof(buff));
- SerialUSB.println(buff[1],DEC);
- SerialUSB.println(buff[63],DEC);
- delay(2000);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement