/*---------------------------------------------------------------------------*/ #if 1 /* But ok! */ unsigned sht11_sreg(void) { unsigned sreg, rcrc; sstart(); /* Start transmission */ if(!swrite(STATUS_REG_R)) { goto fail; } sreg = sread(1); rcrc = sread(0); #ifdef CRC_CHECK { unsigned crc; crc = crc8_add(0x0, STATUS_REG_R); crc = crc8_add(crc, sreg); if (crc != rev8bits(rcrc)) goto fail; } #endif return sreg; fail: sreset(); return -1; }
/* * Only commands MEASURE_HUMI or MEASURE_TEMP! */ static unsigned int scmd(unsigned cmd) { unsigned long n; if(cmd != MEASURE_HUMI && cmd != MEASURE_TEMP) { return -1; } MCUCR |= (1<<JTD); MCUCR |= (1<<JTD); sreset(); /* Start transmission */ if(!swrite(cmd)) { //printf("-2"); goto fail; } for(n = 0; n < 250000; n++) { if(!SDA_IS_1) { unsigned t0, t1, rcrc; t0 = sread(1); t1 = sread(1); rcrc = sread(0); //printf("t0:%d",t0); //printf("t1:%d",t1); #ifdef CRC_CHECK { unsigned crc; crc = crc8_add(0x0, cmd); crc = crc8_add(crc, t0); crc = crc8_add(crc, t1); if(crc != rev8bits(rcrc)) { // printf("-3"); goto fail; } } #endif MCUCR &= (0<<JTD); MCUCR &= (0<<JTD); return (t0 << 8) | t1; } } fail: sreset(); //printf("-1"); MCUCR &= (0<<JTD); MCUCR &= (0<<JTD); return -1; }
/* * Only commands MEASURE_HUMI or MEASURE_TEMP! */ static unsigned int scmd(unsigned cmd) { unsigned int n; if(cmd != MEASURE_HUMI && cmd != MEASURE_TEMP) { PRINTF("Illegal command: %d\n", cmd); return -1; } sstart(); /* Start transmission */ if(!swrite(cmd)) { PRINTF("SHT11: scmd - swrite failed\n"); goto fail; } for(n = 0; n < 20000; n++) { if(!SDA_IS_1) { unsigned t0, t1, rcrc; t0 = sread(1); t1 = sread(1); rcrc = sread(0); PRINTF("SHT11: scmd - read %d, %d\n", t0, t1); #ifdef CRC_CHECK { unsigned crc; crc = crc8_add(0x0, cmd); crc = crc8_add(crc, t0); crc = crc8_add(crc, t1); if(crc != rev8bits(rcrc)) { PRINTF("SHT11: scmd - crc check failed %d vs %d\n", crc, rev8bits(rcrc)); goto fail; } } #endif return (t0 << 8) | t1; } /* short wait before next loop */ clock_wait(1); } fail: sreset(); return -1; }
static void End_Callback(void) { uint8_t i; // If there was a communication error, return and don't process packet if (CommStatus & COMM_ERROR) return; if (SMB_Packet.RxCounter != 0x00) { #ifdef SMB_NACK_WHILE_BUSY TI_MSPBoot_CI_PHYDL_disable(); // NACK until we have processed the command #endif #ifdef SMB_PEC_SUPPORTED // Packet with PEC should have at least more than 1 byte (CMD + PEC) if ((SMB_Packet.RxCounter > 1) && (SMB_Packet.RxPacket[0] & PEC_CMD)) { SMB_Packet.Pec = 0x00; crc8_add(&SMB_Packet.Pec, I2C_SLAVE_ADDR_W); for (i=0; i < (SMB_Packet.RxCounter-1); i++) crc8_add(&SMB_Packet.Pec, SMB_Packet.RxPacket[i]); if (SMB_Packet.Pec != SMB_Packet.RxPacket[SMB_Packet.RxCounter -1]) { SMB_Packet.TxByte = RESPONSE_PEC_ERROR; #ifdef SMB_NACK_WHILE_BUSY TI_MSPBoot_CI_PHYDL_reenable(); #endif return; } } #endif CommStatus |= COMM_PACKET_RX; // Packet was received } }