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);
}
Exemplo n.º 2
0
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, &reg, buf, len);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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, &reg, &buf, 1);
}
Exemplo n.º 5
0
int I2CSlave::write(const char *data, int length) {
    return i2c_slave_write(&_i2c, data, length) != length;
}