void PCF8574::blink(int pin,int time,int wait){
	if((pin >= 0) && (pin < 8)){
		i2cRead();
		for(int i=0;i<time;i++){
			bitWrite(PCFPORTA,pin,0);
			i2cSend();
			delay(wait);
			bitWrite(PCFPORTA,pin,1);
			i2cSend();
			delay(wait);
		}
	}
}
void PCF8574::toggle(int pin){
	if((pin >= 0) && (pin < 8)){
		i2cRead();
		bitWrite(PCFPORTA,pin,!bitRead(PCFPORTA,pin));
		i2cSend();
	}
}
void i2cWriteReg(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t regAddr, uint8_t value)
{
	uint8_t txbuf[2];
	txbuf[0] = regAddr;
	txbuf[1] = value;

	i2cSend(i2c, slaveAddr, txbuf, 2);
}
void PCF8574::pullDown(int pin){
	if((pin >= 0) && (pin < 8)){
		PCFPULL[pin] == 2;
		i2cRead();
		bitWrite(PCFPORTA,pin,0);
		i2cSend(PCFPORTA);
	}
}
uint8_t i2cReadByte(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t regAddr)
{
	uint8_t ret = 0xAA;

	i2cSend(i2c, slaveAddr, &regAddr, 1);
	i2cRead(i2c, slaveAddr, &ret, 1);

	return ret;
}
uint16_t i2cReadWord(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t regAddr)
{
	uint8_t ret[2] = { 0xAA, 0xAA };

	i2cSend(i2c, slaveAddr, &regAddr, 1);
	i2cRead(i2c, slaveAddr, ret, 2);

	return (uint16_t)((ret[0] << 8) | (ret[1] & 0x00FF));
}
int main(void) {

  uint8_t tempHighByte, tempLowByte;

  // -------- Inits --------- //
  clock_prescale_set(clock_div_1);                             /* 8MHz */
  initUSART();
  printString("\r\n====  i2c Thermometer  ====\r\n");
  initI2C();

  // ------ Event loop ------ //
  while (1) {
                        /* To set register, address LM75 in write mode */
    i2cStart();
    i2cSend(LM75_ADDRESS_W);
    i2cSend(LM75_TEMP_REGISTER);
    i2cStart();                      /* restart, just send start again */
                              /* Setup and send address, with read bit */
    i2cSend(LM75_ADDRESS_R);
                               /* Now receive two bytes of temperature */
    tempHighByte = i2cReadAck();
    tempLowByte = i2cReadNoAck();
    i2cStop();

    // Print it out nicely over serial for now...
    printByte(tempHighByte);
    if (tempLowByte & _BV(7)) {
      printString(".5\r\n");
    }
    else {
      printString(".0\r\n");
    }

                                                    /* Once per second */
    _delay_ms(1000);

  }                                                  /* End event loop */
  return 0;                            /* This line is never reached */
}
Example #8
0
static portTASK_FUNCTION(readTemp, args) {
	while (1) {
		i2cAcquire(DS3232_I2C_ADDRESS);
		i2cSend(0x11);
		unsigned char tempMSB = i2cReceive(I2C_ACK);
		unsigned char tempLSB = i2cReceive(I2C_NACK) >> 6;
		i2cRelease();

		printf("Temp %d.%d C\n", tempMSB, 25 * tempLSB);

		vTaskDelay(1000 / portTICK_PERIOD_MS);
	}
}
Example #9
0
void i2cIsrHandler(){

//SSP_Handler

   // setting up for 3 byte messages as follows:
   // | type byte | msg data |
			//
			// 3 bytes are received when slave is reading from master.
			// Hence this is the reason why the arduino is sending sending out 3 bytes
			//
			// Only 2 bytes are sent when slave is writing to master
			//
   // Address is handled by the pic, so is ignored by our isr code.
   
   // Bit 3 of SSPSTAT = R/W bit
   // Bit 5 of SSPSTAT = D/A bit

	PORTD = 0x03;		// I2C error indicator: got stuck in i2cIsrHandler

    if ((SSPSTAT & 0b00100100) == 0b00100000){ // D_A high, R_W low, write w/ data in buffer
		
		PORTD = 0x04;		//I2C error indicator: Got stuck reading data from Arduino
		
        i2cBuffer[i2cBufferVal] = SSPBUF;
        i2cBufferVal++;
		
    } else if ((SSPSTAT & 0b00100100) == 0b00000000){ // D_A low,R_W low, write w/ addr in buffer
        // Empty the buffer and carry on, this shouldn't happen since the pic does addr matching.
        
		PORTD = 0x05;		//I2C error indicator: Got stuck reading address from Arduino
		SSPBUF = 0;
		

    } else if ((SSPSTAT & 0b00100100) == 0b00000100){ // D_A low,R_W high, read w/ addr in buffer
		// Not sure why, but the first char of data is being sent in this else statement

		PORTD = 0x06;		//I2C error indicator: Got stuck writing data to arduino
        if (i2cWriteInt == 0)
        {
            i2cWriteInt = 1;
            i2cSend(COUNTS);
        }
	
    } else if ((SSPSTAT & 0b00100100) == 0b00100100){ // D_A high,R_W high, read w/ data in buffer
		// The send char of the message is being sent though 
		PORTD = 0x07;		//I2C error indicator: Got stuck writing address to arduino
 		if (i2cWriteInt == 1)
        {
            i2cWriteInt = 0;
            i2cSend(COUNTS >> 8);
        }
Example #10
0
void i2cIsrHandler(){

//SSP_Handler

   // setting up for 3 byte messages as follows:
   // | type byte | msg data |
			//
			// 3 bytes are received when slave is reading from master.
			// Hence this is the reason why the arduino is sending sending out 3 bytes
			//
			// Only 2 bytes are sent when slave is writing to master
			//
   // Address is handled by the pic, so is ignored by our isr code.

   // Bit 3 of SSPSTAT = R/W bit
   // Bit 5 of SSPSTAT = D/A bit
    int OdomTemp = 0;

    if ((SSPSTAT & 0b00100100) == 0b00100000){ // D_A high, R_W low, write w/ data in buffer
        i2cBuffer[i2cBufferVal] = SSPBUF;
        i2cBufferVal++;

    } else if ((SSPSTAT & 0b00100100) == 0b00000000){ // D_A low,R_W low, write w/ addr in buffer
        // Empty the buffer and carry on, this shouldn't happen since the pic does addr matching.
        SSPBUF = 0;

    } else if ((SSPSTAT & 0b00100100) == 0b00000100){ // D_A low,R_W high, read w/ addr in buffer
		// Not sure why, but the first char of data is being sent in this statement
        if (i2cWriteInt == 0)
        {
            OdomTemp = OdometryCounts;
            i2cWriteInt = 1;
            i2cSend(OdometryCounts);
        }

    } else if ((SSPSTAT & 0b00100100) == 0b00100100){ // D_A high,R_W high, read w/ data in buffer
		// The second char of the message is being sent though
        if (i2cWriteInt == 1)
        {
            i2cWriteInt++;
            i2cSend(OdometryCounts >> 8);
            OdometryCounts = 0;
        }
        else if (i2cWriteInt == 2)
Example #11
0
uint8 i2cRegisterRead(uint8 sadd, uint8 regadd)
{
	int d = 0;
	uint8 buff;
	buff = (regadd-1)*2;
	i2cSetSlaveAdd(i2cREG1, sadd);
	i2cSetCount(i2cREG1, 1);
	i2cSetMode(i2cREG1, I2C_MASTER | I2C_TRANSMITTER | I2C_START_COND);
	i2cSend(i2cREG1, 1,&buff);
	while((i2cREG1->STR &  (uint32)I2C_ARDY) == 0U)
	{}
	i2cSetMode(i2cREG1, I2C_MASTER | I2C_RECEIVER | I2C_START_COND | I2C_STOP_COND);
	i2cREG1->MDR = i2cREG1->MDR & (uint32)0xFFFFFDFF;
	i2cSetCount(i2cREG1, 1);
	i2cReceive(i2cREG1, 1, &buff);

	while(d < 50)
	{
		d++;
	}

	return buff;
}
void PCF8574::clear(){
		PCFPORTA = 0x00;
		i2cSend();
}
uint8_t i2cOp(uint8_t instance, uint8_t addr, const uint8_t* sendData, uint8_t sendSz, uint8_t* recvData, uint8_t recvSz){

    uint8_t ret = I2C_ERR_NAK;
    uint32_t stat;

#if I2C_PDC
    uint8_t dat[256];
    uint8_t i;
    uint32_t tmp;
    if (sendData != NULL && (uint32_t)sendData < 0x20000000) {  /* Undocumented feature: PDC can't read from flash */
        if (sendSz > 256)
            return I2C_ERR_INVAL;
        for (i = 0; i < sendSz; i++)
            dat[i] = *sendData++;
        sendData = dat;
    }
#endif

#if !I2C_BITBANG
    Twi *pTwi;
#endif

    if(instance >= I2C_NUM_INSTANCES) return I2C_ERR_INVAL;

#if !I2C_BITBANG
    pTwi = (instance == 0) ? TWI0 : TWI1;
#endif

#if I2C_BITBANG
    addr <<= 1;

    if(sendSz || !recvSz){	//if neither send nor recv requested, do a single send -> this is for a scan

        i2cStart(instance);

        if(!i2cSend(instance, addr)) goto out;
        while(sendSz--) if(!i2cSend(instance, *sendData++)) goto out;
    }
    if(recvSz){

        i2cStart(instance); //if we already sent something, restart

        if(!i2cSend(instance, addr | 1)) goto out;
        while(recvSz){
            recvSz--;
            *recvData++ = i2cRecv(instance, !!recvSz);
        }
    }

    ret = I2C_ALL_OK;
#else

    if (sendSz == 0 && recvSz == 0) {   // Quick (for a scan)
        pTwi->TWI_MMR = 0;
        pTwi->TWI_MMR = (addr << 16);
        pTwi->TWI_CR = TWI_CR_QUICK;
        if (TWI_SR_NACK & i2cWaitTx(pTwi)) {
            i2cWaitComplete(pTwi);
            ret = I2C_ERR_NAK;
            goto out;
        }
        i2cWaitComplete(pTwi);
    }

#if I2C_PDC
    if (sendSz != 0) {
        pTwi->TWI_TPR = (uint32_t)sendData;
        pTwi->TWI_TCR = sendSz;
        pTwi->TWI_MMR = 0;
        pTwi->TWI_MMR = (addr << 16);
        pTwi->TWI_IADR = 0;
        pTwi->TWI_IADR = 0;
        pTwi->TWI_PTCR = TWI_PTCR_TXTEN;
#if I2C_INT_PDC
        i2cInst[instance].status = I2C_STAT_BUSY;
        pTwi->TWI_IER = TWI_IER_TXBUFE | TWI_IER_NACK;
        while((i2cInst[instance].status != I2C_STAT_DONE) &&
              (i2cInst[instance].status != I2C_STAT_NACK))
            coopYield();
        if (i2cInst[instance].status == I2C_STAT_NACK) {
            ret = I2C_ERR_NAK;
            goto out;
        }
#else

        if (TWI_SR_NACK & i2cWaitPdcTx(pTwi)) {
            i2cPdcDisable(pTwi);
            i2cWaitComplete(pTwi);
            ret = I2C_ERR_NAK;
            goto out;
        }
        i2cPdcDisable(pTwi);
        pTwi->TWI_CR = TWI_CR_STOP;
        i2cWaitComplete(pTwi);
#endif
    }

    if (recvSz == 1) {              // We are forced to do the one byte reads manually.
        pTwi->TWI_RPR = (uint32_t)recvData;
        pTwi->TWI_RCR = 1;
        pTwi->TWI_MMR = 0;
        pTwi->TWI_MMR = TWI_MMR_MREAD | (addr << 16);
        pTwi->TWI_CR = TWI_CR_START | TWI_CR_STOP;
        pTwi->TWI_PTCR = TWI_PTCR_RXTEN;
#if I2C_INT_PDC
        i2cInst[instance].status = I2C_STAT_LASTREAD;
        pTwi->TWI_IER = TWI_IER_RXBUFF | TWI_IER_NACK;
        while((i2cInst[instance].status != I2C_STAT_DONE) &&
              (i2cInst[instance].status != I2C_STAT_NACK))
            coopYield();
        if (i2cInst[instance].status == I2C_STAT_NACK) {
            ret = I2C_ERR_NAK;
            goto out;
        }
#else

        if (TWI_SR_NACK & i2cWaitPdcRx(pTwi)) {
            i2cPdcDisable(pTwi);
            i2cWaitComplete(pTwi);
            ret = I2C_ERR_NAK;
            goto out;
        }
        i2cPdcDisable(pTwi);
        i2cWaitComplete(pTwi);
#endif
    }

    if (recvSz > 1) {
        pTwi->TWI_RPR = (uint32_t)recvData;
        pTwi->TWI_RCR = recvSz - 1; // Last byte read is handled manually
        pTwi->TWI_MMR = 0;
        pTwi->TWI_MMR = TWI_MMR_MREAD | (addr << 16);
        pTwi->TWI_CR = TWI_CR_START;
        pTwi->TWI_PTCR = TWI_PTCR_RXTEN;

#if I2C_INT_PDC
        i2cInst[instance].lastByte = recvData + recvSz - 1;
        i2cInst[instance].status = I2C_STAT_BUSY;
        pTwi->TWI_IER = TWI_IER_RXBUFF | TWI_IER_NACK;
        while((i2cInst[instance].status != I2C_STAT_DONE) &&
              (i2cInst[instance].status != I2C_STAT_NACK))
            coopYield();
        if (i2cInst[instance].status == I2C_STAT_NACK) {
            ret = I2C_ERR_NAK;
            goto  out;
        }
#else
        if (TWI_SR_NACK & i2cWaitPdcRx(pTwi)) {
            i2cPdcDisable(pTwi);
            i2cWaitComplete(pTwi);
            ret = I2C_ERR_NAK;
            goto out;
        }
        i2cPdcDisable(pTwi);
        pTwi->TWI_CR = TWI_CR_STOP;
        pTwi->TWI_RPR = (uint32_t)(recvData + recvSz - 1);
        pTwi->TWI_RCR = 1;
        pTwi->TWI_PTCR = TWI_PTCR_RXTEN;
        if (TWI_SR_NACK & i2cWaitPdcRx(pTwi)) {
            i2cPdcDisable(pTwi);
            i2cWaitComplete(pTwi);
            ret = I2C_ERR_NAK;
            goto out;
        }
        i2cPdcDisable(pTwi);
        i2cWaitComplete(pTwi);
#endif
    }
    ret = I2C_ALL_OK;
#else
    if (sendSz != 0) {
        pTwi->TWI_MMR = 0;
        pTwi->TWI_MMR = (addr << 16);
        pTwi->TWI_IADR = 0;
        pTwi->TWI_IADR = 0;
        while (sendSz--) {
            pTwi->TWI_THR = *sendData++;
            stat = i2cWaitTx(pTwi);
            if (stat & TWI_SR_NACK) {
                ret = I2C_ERR_NAK;
                goto out;
            }
        }
        pTwi->TWI_CR = TWI_CR_STOP;
        i2cWaitComplete(pTwi);
    }

    if (recvSz == 1) {
        pTwi->TWI_MMR = 0;
        pTwi->TWI_MMR = TWI_MMR_MREAD | (addr << 16);
        pTwi->TWI_IADR = 0;
        pTwi->TWI_IADR = 0;
        pTwi->TWI_CR = TWI_CR_START | TWI_CR_STOP;
        if (TWI_SR_NACK & i2cWaitRx(pTwi)) {
            ret = I2C_ERR_NAK;
            goto out;
        }
        *recvData = pTwi->TWI_RHR;
        i2cWaitComplete(pTwi);
    } else if (recvSz >= 1) {
        pTwi->TWI_MMR = 0;
        pTwi->TWI_MMR = TWI_MMR_MREAD | (addr << 16);
        pTwi->TWI_IADR = 0;
        pTwi->TWI_IADR = 0;
        pTwi->TWI_CR = TWI_CR_START;
        while (recvSz--) {
            if (TWI_SR_NACK & i2cWaitRx(pTwi)) {
                ret = I2C_ERR_NAK;
                goto out;
            }
            dbgPrintf("\0");
            *recvData++ = pTwi->TWI_RHR;
            if (recvSz == 1) pTwi->TWI_CR = TWI_CR_STOP;
        }
        i2cWaitComplete(pTwi);
    }

    ret = I2C_ALL_OK;
#endif
#endif

out:

#if I2C_BITBANG
    i2cStop(instance);
#else
    if (ret != I2C_ALL_OK) {
        pTwi->TWI_CR = TWI_CR_STOP;
        i2cWaitComplete(pTwi);
    }
#endif

    return ret;
}
void i2cSendByte(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t data)
{
	i2cSend(i2c, slaveAddr, &data, 1);
}
void PCF8574::digitalWrite(int pin,int value){
	//if((pin >= 0) && (pin < 8)){
		bitWrite(PCFPORTA,pin,value);
		i2cSend();
	//}
}
void PCF8574::set(){
		PCFPORTA = 0xFF;
		i2cSend();
}
void PCF8574::write(int value){
	PCFPORTA = value;
	i2cSend();
}