static void i2cStop(uint8_t instance){

    i2cDelay(instance);
    sdaLo(instance);
    i2cDelay(instance);
    sclHi(instance);
    i2cDelay(instance);
    sdaHi(instance);
}
static void i2cBitTx(uint8_t instance, char bit){

    if(bit) sdaHi(instance);
    else sdaLo(instance);
    i2cDelay(instance);
    sclHi(instance);
    i2cDelay(instance);
    sclLo(instance);
}
static void i2cStart(uint8_t instance){

    sdaHi(instance);
    sclHi(instance);
    i2cDelay(instance);
    sdaLo(instance);
    i2cDelay(instance);
    sclLo(instance);
    i2cDelay(instance);
}
示例#4
0
void SoftI2C::stop()
{
    pinMode(_dataPin, OUTPUT);
    digitalWrite(_dataPin, LOW);
    digitalWrite(_clockPin, HIGH);
    i2cDelay();
    digitalWrite(_dataPin, HIGH);
    i2cDelay();
    started = false;
    inWrite = false;
}
示例#5
0
bool SoftI2C::readBit()
{
    pinMode(_dataPin, INPUT);
    digitalWrite(_dataPin, HIGH);
    digitalWrite(_clockPin, HIGH);
    bool bit = digitalRead(_dataPin);
    i2cDelay();
    digitalWrite(_clockPin, LOW);
    i2cDelay();
    return bit;
}
static char i2cBitRx(uint8_t instance){

    char ret;

    sdaHi(instance);
    i2cDelay(instance);
    sclHi(instance);
    i2cDelay(instance);
    ret = sdaRd(instance);
    sclLo(instance);

    return ret;
}
示例#7
0
void SoftI2C::writeBit(bool bit)
{
    pinMode(_dataPin, OUTPUT);
    if (bit)
        digitalWrite(_dataPin, HIGH);
    else
        digitalWrite(_dataPin, LOW);
    i2cDelay();
    digitalWrite(_clockPin, HIGH);
    i2cDelay();
    digitalWrite(_clockPin, LOW);
    i2cDelay();
}
示例#8
0
void SoftI2C::start()
{
    pinMode(_dataPin, OUTPUT);
    if (started) {
        // Already started, so send a restart condition.
        digitalWrite(_dataPin, HIGH);
        digitalWrite(_clockPin, HIGH);
        i2cDelay();
    }
    digitalWrite(_dataPin, LOW);
    i2cDelay();
    digitalWrite(_clockPin, LOW);
    i2cDelay();
    started = true;
    acked = true;
}
uint8_t i2cInit(uint8_t instance, uint32_t clock){
    uint8_t i;

    if(instance >= I2C_NUM_INSTANCES) return I2C_ERR_INVAL;

    gpioSetFun(pins[instance][0], GPIO_FUNC_GPIO);
    gpioSetFun(pins[instance][1], GPIO_FUNC_GPIO);
    gpioSetPullup(pins[instance][0], 1);
    gpioSetPullup(pins[instance][1], 1);
    gpioSetDir(pins[instance][0], 0);
    gpioSetDir(pins[instance][1], 0);
    gpioSetVal(pins[instance][0], 0);
    gpioSetVal(pins[instance][1], 0);
    sdaHi(instance);
    sclHi(instance);
    delayTicks[instance] = (TICKS_PER_MS * 1000) / (8 * clock * 2);
    i2cDelay(instance);
    i2cDelay(instance);
    for (i = 0; i < 100; i++)       // Try to reset the bus
        i2cBitTx(instance, 1);
    i2cStop(instance);

#if !I2C_BITBANG
    PMC_EnablePeripheral(instance ? ID_TWI1 : ID_TWI0);
    gpioSetFun(pins[instance][0], GPIO_FUNC_A);
    gpioSetFun(pins[instance][1], GPIO_FUNC_A);
    TWI_ConfigureMaster(instance ? TWI1 : TWI0, clock, BOARD_MCK);

#if I2C_INT_PDC
    NVIC_EnableIRQ(instance ? TWI1_IRQn : TWI0_IRQn);
    if (instance)
        TWI1->TWI_IDR = 0x00F77;
    else
        TWI0->TWI_IDR = 0x00F77;
#endif

#endif


    return I2C_ALL_OK;
}