Esempio n. 1
0
uint8_t fm24_sleep(void)
{
    uint8_t rv = 0;
    uint8_t i2c_buff[1] = { FM24_BA << 1 };
    uint8_t i2c_data[1] = { FM24_SLEEP };

    i2c_package_t pkg;
    pkg.slave_addr = FM24_RSVD;
    pkg.addr = i2c_buff;
    pkg.addr_len = 1;
    pkg.data = i2c_data;
    pkg.data_len = 1;
    pkg.options = I2C_NO_ADDR_SHIFT | I2C_WRITE;

#ifdef HARDWARE_I2C
    i2c_transfer_start(&pkg, NULL);
#else
    rv = i2cm_transfer(&pkg);
    //if (rv != I2C_ACK) {
    //    return EXIT_FAILURE;
    //}
#endif

    fm24_status &= ~FM24_AWAKE;
    return rv;
}
Esempio n. 2
0
uint32_t fm24_read(uint8_t * data, const uint32_t data_len)
{
    uint8_t rv = 0;

    i2c_package_t pkg;
    pkg.slave_addr = FM24_BA;
    pkg.addr = NULL;
    pkg.addr_len = 0;
    pkg.data = data;
    pkg.data_len = data_len;
    pkg.options = I2C_READ | I2C_LAST_NAK;

#ifdef HARDWARE_I2C
    i2c_transfer_start(&pkg, NULL);
#else
    rv = i2cm_transfer(&pkg);
    if (rv != I2C_ACK) {
        return EXIT_FAILURE;
    }
#endif

#ifdef FM24_HAS_SLEEP_MODE
    fm24_status |= FM24_AWAKE;
#endif
    return EXIT_SUCCESS;
}
Esempio n. 3
0
void mcp_dac_write(uint8_t address, uint16_t value)
{
    /* Prepare the buffer */
    /* we always perform writes (R/W bit is 0) */
    buffer[0U] = address;
    buffer[1U] = (uint8_t)(((uint16_t)(value >> 8U)) & 0x0FU);
    buffer[2U] = (uint8_t)((uint16_t)(value));
    /* Update the DAC register using the Fast Mode */
    i2c_transfer_set_data(buffer, 3U);
    i2c_transfer_start();
    i2c_transfer_successful();
}
Esempio n. 4
0
uint32_t fm24_write(uint8_t * data, const uint32_t addr,
                    const uint32_t data_len)
{
    uint8_t rv = 0;
    uint8_t retry;
    uint32_t c_addr;
    uint8_t i2c_buff[2];

    // in case a seek beyond the end of device is requested
    // we roll to the beginning since this memory is circular in nature
    if (addr > FM_LA) {
        c_addr = addr % FM_LA - 1;
    } else {
        c_addr = addr;
    }

    m.e = addr;

    i2c_buff[0] = (c_addr & 0xff00) >> 8;
    i2c_buff[1] = c_addr & 0xff;

    pkg.slave_addr = FM24_BA | (c_addr >> 16);
    pkg.addr = i2c_buff;
    pkg.addr_len = 2;
    pkg.data = data;
    pkg.data_len = data_len;
    pkg.options = I2C_WRITE;

    for (retry = 0; retry < FM24_MAX_RETRY; retry++) {
#ifdef HARDWARE_I2C
        i2c_transfer_start(&pkg, NULL);
#else
        rv = i2cm_transfer(&pkg);
        if (rv == I2C_ACK) {
            m.e += data_len;
            if (m.e > FM_LA) {
                m.e = m.e % FM_LA - 1;
            }
            break;
        }
#endif
    }

#ifdef FM24_HAS_SLEEP_MODE
    fm24_status |= FM24_AWAKE;
#endif
    return 0;
}
Esempio n. 5
0
uint8_t fm24_seek(const uint32_t addr)
{
    uint8_t rv = 255;
    uint8_t retry;
    uint32_t c_addr;
    uint8_t i2c_buff[2];
    i2c_package_t pkg;

    // in case a seek beyond the end of device is requested
    // we roll to the beginning since this memory is circular in nature
    if (addr > FM_LA) {
        c_addr = addr % FM_LA - 1;
    } else {
        c_addr = addr;
    }

    i2c_buff[0] = (c_addr & 0xff00) >> 8;
    i2c_buff[1] = c_addr & 0xff;

    pkg.slave_addr = FM24_BA | (c_addr >> 16);
    pkg.addr = NULL;
    pkg.addr_len = 0;
    pkg.data = i2c_buff;
    pkg.data_len = 2;
    pkg.options = I2C_WRITE;

    for (retry = 0; retry < FM24_MAX_RETRY; retry++) {
#ifdef HARDWARE_I2C
        i2c_transfer_start(&pkg, NULL);
#else
        rv = i2cm_transfer(&pkg);
        if (rv == I2C_ACK) {
            break;
        }
#endif
    }

    if (rv != I2C_ACK) {
        return EXIT_FAILURE;
    }

#ifdef FM24_HAS_SLEEP_MODE
    fm24_status |= FM24_AWAKE;
#endif
    return EXIT_SUCCESS;
}