static void handler (void) { // Disable interrupt temp extint_disable (extint1); irq_clear (AT91C_ID_IRQ1); uint8_t addr; uint8_t buffer[2]; i2c_ret_t ret; DELAY_US (4); //pio_output_toggle (LED1_PIO); ret = i2c_slave_read (i2c_slave1, buffer, sizeof (buffer), 10000); addr = buffer[0] - ARRAY_OFFSET; if (addr >= sizeof (comms_data)) addr = 0; if (ret == 1) { // Have not received photo line command. if (buffer[0] != CD_PHOTO_LINE) ret = i2c_slave_write (i2c_slave1, comms_data[addr], 130, 1000); // Return data requested. else { // check if photo ready. if (comms_data[CD_PHOTO_READY-ARRAY_OFFSET]) { ret = i2c_slave_write (i2c_slave1, comms_data[CD_PHOTO_NEXT_LINE-ARRAY_OFFSET], 130, 1000); if (ret > 0) { ret++; *comms_data[CD_FAULT - ARRAY_OFFSET] = ret; comms_data[CD_PHOTO_NEXT_LINE-ARRAY_OFFSET] += ret; if ((comms_data[CD_PHOTO_NEXT_LINE-ARRAY_OFFSET] - image) == image_size) { // We have sent the entire picture comms_data[CD_PHOTO_NEXT_LINE-ARRAY_OFFSET] = image; comms_data[CD_PHOTO_READY-ARRAY_OFFSET] = 0; } } } } } if (ret == 2) { if (buffer[0] == COMMS_COMMAND) next_command = buffer[1]; } extint_enable (extint1); }
int ds1307_write_ram(i2c_dev_t *dev, uint8_t offset, uint8_t *buf, uint8_t len) { if (offset + len > RAM_SIZE) return -EINVAL; uint8_t reg = RAM_REG + offset; return i2c_slave_write(dev->bus, dev->addr, ®, buf, len); }
void ds1307_set_time(i2c_dev_t *dev, const struct tm *time) { uint8_t buf[8]; buf[0] = TIME_REG; buf[1] = dec2bcd(time->tm_sec); buf[2] = dec2bcd(time->tm_min); buf[3] = dec2bcd(time->tm_hour); buf[4] = dec2bcd(time->tm_wday + 1); buf[5] = dec2bcd(time->tm_mday); buf[6] = dec2bcd(time->tm_mon + 1); buf[7] = dec2bcd(time->tm_year - 2000); i2c_slave_write(dev->bus, dev->addr, &buf[0], &buf[1], 7); }
static void update_register(i2c_dev_t *dev, uint8_t reg, uint8_t mask, uint8_t val) { uint8_t buf = (read_register(dev, reg) & mask) | val; i2c_slave_write(dev->bus, dev->addr, ®, &buf, 1); }
int I2CSlave::write(const char *data, int length) { return i2c_slave_write(&_i2c, data, length) != length; }