void i2c_scan(void) { uchar i = 0; for(i=0;i<127;i++) { i2c_start(); // do start transition if(i2c_put_u08(i << 1)) // send DEVICE address DEBUGF("I2C device at address 0x%x\n", i); i2c_stop(); } }
static uchar i2c_do(struct i2c_cmd *cmd) { uchar addr; LED_PORT |= LED_BV DEBUGF("i2c %s at 0x%02x, len = %d\n", (cmd->flags&I2C_M_RD)?"rd":"wr", cmd->addr, cmd->len); /* normal 7bit address */ addr = ( cmd->addr << 1 ); if (cmd->flags & I2C_M_RD ) addr |= 1; if(cmd->cmd & CMD_I2C_BEGIN) i2c_start(); else i2c_repstart(); // send DEVICE address if(!i2c_put_u08(addr)) { DEBUGF("I2C read: address error @ %x\n", addr); status = STATUS_ADDRESS_NAK; expected = 0; i2c_stop(); } else { status = STATUS_ADDRESS_ACK; expected = cmd->len; saved_cmd = cmd->cmd; /* check if transfer is already done (or failed) */ if((cmd->cmd & CMD_I2C_END) && !expected) i2c_stop(); } /* more data to be expected? */ LED_PORT &= ~LED_BV; return(cmd->len?0xff:0x00); }
extern void usb_out ( byte_t* data, byte_t len ) #endif { uchar i, err=0; DEBUGF("write %d bytes, %d exp\n", len, expected); if(status == STATUS_ADDRESS_ACK) { if(len > expected) { DEBUGF("exceeds!\n"); len = expected; } // consume bytes for(i=0;i<len;i++) { expected--; DEBUGF("data = %x\n", *data); if(!i2c_put_u08(*data++)) err = 1; } // end transfer on last byte if((saved_cmd & CMD_I2C_END) && !expected) i2c_stop(); if(err) { DEBUGF("write failed\n"); //TODO: set status } } else { DEBUGF("not in ack state\n"); memset(data, 0, len); } #ifndef USBTINY return len; #endif }
// ---------------------------------------------------------------------- // Handle an OUT packet. // ---------------------------------------------------------------------- uchar usbFunctionWrite(uchar *data, uchar len) { uchar i, err=0; DEBUGF("write %d bytes, %d exp\n", len, expected); if(status == STATUS_ADDRESS_ACK) { if(len > expected) { DEBUGF("exceeds!\n"); len = expected; } // consume bytes for(i=0;i<len;i++) { expected--; DEBUGF("data = %x\n", *data); if(!i2c_put_u08(*data++)) err = 1; } // end transfer on last byte if((saved_cmd & CMD_I2C_END) && !expected) i2c_stop(); if(err) { DEBUGF("write failed\n"); //TODO: set status } } else { DEBUGF("not in ack state\n"); memset(data, 0, len); } return len; }