主题中讨论的其他器件:ADS112C04
您好!
我 正在尝试从 ADS112C04读取数据。 因此、我编写的函数基本上像 eusci_b_i2c 库中的相应函数一样工作、但具有重复的启动条件。 ADC 的初始化工作正常、我可以写入所有寄存器、IDAC 电流将打开、PGA 也会工作。 我还正确接收到第一个测量值。 但是、当发送 RDATA 命令进行第二次测量时、代码会卡住。
测量由 TimerB 每秒触发四次、这是完整序列:
TimerB 中断->发送 START_SYNC 命令(函数 ADS112C04_Measure)-> DRDY 下降沿 IRQ ->发送 RDATA 并切换至接收(请参阅函数 ADS112C04_Receive)-> I2C RX IRQ ->处理测量数据
该周期在开始时工作一次、第二次卡住(请参阅来源):
bool ADS112C04_init(void)//(uint8_t eUSCI_MODULE) { uint8_t i; const uint16_t delay = 80; const uint8_t regSend[8] = {CMD_WREG0, REG0, CMD_WREG1, REG1, CMD_WREG2, REG2, CMD_WREG3, REG3}; // I2C_ Init EUSCI_B_I2C_initMasterParam i2c_master_init = { EUSCI_B_I2C_CLOCKSOURCE_SMCLK, CS_getSMCLK(), EUSCI_B_I2C_SET_DATA_RATE_100KBPS, 0, EUSCI_B_I2C_NO_AUTO_STOP }; ADS112C04_powerOn(); EUSCI_B_I2C_initMaster(AFE_USCI_BASE, &i2c_master_init); EUSCI_B_I2C_clearInterrupt(AFE_USCI_BASE, UCRXIE); // neu EUSCI_B_I2C_setSlaveAddress(AFE_USCI_BASE, ADS112C04_ADDRESS); EUSCI_B_I2C_setMode(AFE_USCI_BASE,EUSCI_B_I2C_TRANSMIT_MODE); EUSCI_B_I2C_enable(AFE_USCI_BASE); HWREG16(AFE_USCI_BASE + OFS_UCBxCTLW0) |= UCTXSTT; while(HWREG16(AFE_USCI_BASE + OFS_UCBxCTLW0) & UCTXSTT); for (i=0; i<8; i++) { HWREG16(AFE_USCI_BASE + OFS_UCBxTXBUF) = regSend[i]; while ((!(HWREG16(AFE_USCI_BASE + OFS_UCBxIFG) & UCTXIFG)) && --timeout); if (timeout == 0) return (STATUS_FAIL); __delay_cycles(delay); } HWREG16(AFE_USCI_BASE + OFS_UCBxCTLW0) |= UCTXSTP; EUSCI_B_I2C_clearInterrupt(AFE_USCI_BASE, UCRXIE); EUSCI_B_I2C_enableInterrupt(AFE_USCI_BASE, UCRXIE); GPIO_selectInterruptEdge(AFE_EOC_PIN, GPIO_HIGH_TO_LOW_TRANSITION); GPIO_clearInterrupt(AFE_EOC_PIN); GPIO_enableInterrupt(AFE_EOC_PIN); return (STATUS_SUCCESS); } bool ADS112C04_sendCmd(uint8_t command) { bool timeoutError = false; if (!EUSCI_B_I2C_masterSendSingleByteWithTimeout(AFE_USCI_BASE, command, ADS112C04_TIMEOUT)) return (STATUS_FAIL); return (STATUS_SUCCESS); } bool ADS112C04_measure(void) { bool error = false; error = ADS112C04_sendCmd(CMD_START_SYNC); return (error); } bool ADS112C04_receive(void) // RDATA { uint32_t timeout = ADS112C04_TIMEOUT; uint16_t txieStatus = HWREG16(AFE_USCI_BASE + OFS_UCBxIE) & UCTXIE; //Store current transmit interrupt enable HWREG16(AFE_USCI_BASE + OFS_UCBxIE) &= ~(UCTXIE); //Disable transmit interrupt enable HWREG16(AFE_USCI_BASE + OFS_UCBxCTLW0) |= UCTR + UCTXSTT; //Send start condition. while ((!(HWREG16(AFE_USCI_BASE + OFS_UCBxIFG) & UCTXIFG)) && --timeout); //Poll for transmit interrupt flag if (timeout == 0) return (STATUS_FAIL); //Check if transfer timed out HWREG16(AFE_USCI_BASE + OFS_UCBxTXBUF) = CMD_RDATA;//Send single byte data timeout = ADS112C04_TIMEOUT; //Reset timeout /* !!!!!!! THE CODE GETS STUCK IN THE LOOP BELOW !!!!!!!! */ while ((!(HWREG16(AFE_USCI_BASE + OFS_UCBxIFG) & UCTXIFG)) && --timeout);//Poll for transmit interrupt flag. if (timeout == 0) return (STATUS_FAIL); //Check if transfer timed out HWREG16(AFE_USCI_BASE + OFS_UCBxIFG) &= ~(UCTXIFG); //Clear transmit interrupt flag before enabling interrupt again HWREG16(AFE_USCI_BASE + OFS_UCBxIE) |= txieStatus;//Reinstate transmit interrupt enable __delay_cycles(64); // Receive bytesExpected = 2; i2cRxByteCount = 0; EUSCI_B_I2C_setMode(AFE_USCI_BASE, EUSCI_B_I2C_RECEIVE_MODE); HWREG16(AFE_USCI_BASE + OFS_UCBxCTLW0) |= UCTXSTT; // Start return(STATUS_SUCCESS); } #pragma vector = AFE_IRQ_VECT __interrupt void EUSCI_B_ISR(void) { switch(__even_in_range(AFE_IRQ_REG, USCI_I2C_UCBIT9IFG)) //NEU { case USCI_NONE: break; // Vector 0: No interrupts case USCI_I2C_UCALIFG: break; // Vector 2: ALIFG case USCI_I2C_UCNACKIFG: break; // Vector 4: NACKIFG case USCI_I2C_UCSTTIFG: break; // Vector 6: STTIFG case USCI_I2C_UCSTPIFG: break; // Vector 8: STPIFG case USCI_I2C_UCRXIFG3: break; // Vector 10: RXIFG3 case USCI_I2C_UCTXIFG3: break; // Vector 12: TXIFG3 case USCI_I2C_UCRXIFG2: break; // Vector 14: RXIFG2 case USCI_I2C_UCTXIFG2: break; // Vector 16: TXIFG2 case USCI_I2C_UCRXIFG1: break; // Vector 18: RXIFG1 case USCI_I2C_UCTXIFG1: break; // Vector 20: TXIFG1 case USCI_I2C_UCRXIFG0: // Vector 22: RXIFG0 if (bytesExpected > 0) { if (i2cRxByteCount == bytesExpected - 1) { // EUSCI_B_I2C_masterReceiveMultiByteFinish HWREG16(AFE_USCI_BASE + OFS_UCBxCTLW0) |= UCTXSTP; // Stop-Bedingung setzen } i2cRxBuf[i2cRxByteCount] = HWREG16(AFE_USCI_BASE + OFS_UCBxRXBUF); i2cRxByteCount++; if (i2cRxByteCount == bytesExpected) { bytesExpected = 0; i2cRxFlag = true; __bic_SR_register_on_exit(LPM3_bits | GIE); } } break; case USCI_I2C_UCTXIFG0: break; // Vector 24: TXIFG0 case USCI_I2C_UCBCNTIFG: break; // Vector 26: BCNTIFG case USCI_I2C_UCCLTOIFG: break; // Vector 28: clock low timeout case USCI_I2C_UCBIT9IFG: break; // Vector 30: 9th bit default: break; } }