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, ®Addr, 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, ®Addr, 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 */ }
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); } }
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); }
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)
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(); }