Ср авг 17, 2022 11:05:16
Ср авг 17, 2022 11:16:47
vdv22 писал(а):TWCR= (1<<TWINT)|(1<<TWEN)|(1<<TWSTA)|(1<<TWIE);
vdv22 писал(а):TWCR = 1<<TWINT|0<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE; // команда напередачу
Ср авг 17, 2022 11:19:57
Ср авг 17, 2022 11:26:01
switch((TWSR & 0xF8))
case 8:
Ср авг 17, 2022 11:44:06
switch((TWSR & 0xF8))
Ср авг 17, 2022 11:47:13
switch((TWSR & 0xF8))
Ср авг 17, 2022 11:53:24
Ср авг 17, 2022 11:56:40
То где кейсы для 0x38, 0x48, 0x58 ... 0xF8? Каждый флаг должен обрабатываться.vdv22 писал(а):case 8: // если старт прошел
case 0x18: // если аск от ведомого получен
void I2C_IRQHandler(void) {
if ((I2C_DEV->IEN & I2C_IEN_ARBLOST) && (I2C_DEV->IF & I2C_IF_ARBLOST)) {// Arbitration lost; Interrupt Flag: UCALIFG; Interrupt
i2c_error_code = I2C_ERROR;
i2c_state = i2c_idle;
I2C_DEV->IFC = I2C_IFC_ARBLOST;
}
if ((I2C_DEV->IEN & I2C_IEN_NACK) && (I2C_DEV->IF & I2C_IF_NACK)) { // Not acknowledgment; Interrupt Flag: UCNACKIFG
i2c_error_code = I2C_ERROR;
i2c_state = i2c_stop;
I2C_DEV->IFC = I2C_IFC_NACK;
BUS_RegMaskedClear(&I2C_DEV->IEN, I2C_IEN_TXBL);
I2C_DEV->CMD = I2C_CMD_STOP;
}
if ((I2C_DEV->IEN & I2C_IEN_START) && (I2C_DEV->IF & I2C_IF_START)) { // Start condition received; Interrupt Flag: UCSTTIFG
I2C_DEV->IFC = I2C_IFC_START;
I2C_DEV->TXDATA = i2c_addr;
if (i2c_state != rcv_data) {
BUS_RegMaskedSet(&I2C_DEV->IEN, I2C_IEN_TXBL);
}
}
if ((I2C_DEV->IEN & I2C_IEN_RXFULL) && (I2C_DEV->IF & I2C_IF_RXFULL)) { // Check errata race condition
if (((I2C_DEV->STATUS & I2C_STATUS_RXDATAV) == 0) && (I2C_DEV->STATUS & I2C_STATUS_RXFULL)) {
I2C_DEV->RXDATA; // make dummy read.
}
}
итд...
Ср авг 17, 2022 12:06:38
while(!(TWCR & (1<<TWINT)));
Ср авг 17, 2022 12:11:06
while(!(TWCR & (1<<TWINT)));
Ср авг 17, 2022 12:30:23
Вариант:
----------
ISR(TWI_vect){
static unsigned char state = 0, lastVal = 0;
// Disable Global Interrupt
cli();
switch(TW_STATUS){
case TW_START: // 0x08
case TW_REP_START: // 0x10
case TW_MT_SLA_ACK: // 0x18
case TW_MT_SLA_NACK: // 0x20
case TW_MT_DATA_ACK: // 0x28
case TW_MT_DATA_NACK: // 0x30
case TW_MR_SLA_ACK: // 0x40
case TW_MR_SLA_NACK: // 0x48
case TW_MR_DATA_ACK: // 0x50
case TW_MR_DATA_NACK: // 0x58
case TW_ST_ARB_LOST_SLA_ACK: // 0xB0
case TW_SR_ARB_LOST_SLA_ACK: // 0x68
case TW_SR_GCALL_ACK: //0x70
case TW_SR_ARB_LOST_GCALL_ACK: // 0x78
case TW_SR_GCALL_DATA_ACK: // 0x90
case TW_SR_GCALL_DATA_NACK: // 0x98
case TW_NO_INFO: // 0xF8
TWCR |= (1<<TWINT); // Clear TWINT Flag
break;
case TW_SR_SLA_ACK: // 0x60: SLA+W received, ACK returned
TWCR |= (1<<TWINT); // Clear TWINT Flag
break;
case TW_SR_DATA_ACK: // data received
state = TWDR;
if(lastVal == 'S'){
targetTemp = state;
state = 0;
}
lastVal = state;
TWCR |= (1<<TWINT); // Clear TWINT Flag
break;
case TW_SR_STOP: // 0xA0: stop or repeated start condition received while selected
TWCR |= (1<<TWINT); // Clear TWINT Flag
break;
case TW_ST_SLA_ACK: // 0xA8: SLA+R received, ACK returned
if(state == 'T'){
TWDR = temperature; // Fill TWDR register whith the data to be sent
}else if(state == 'H'){
TWDR = humidity;
}else{
TWDR = -1;
}
TWCR = ((1 << TWEA) | (1 << TWINT) | (1 << TWEN) | (1 << TWIE)); // Enable TWI, Clear TWI interrupt flag
break;
case TW_ST_DATA_ACK: // 0xB8: data transmitted, ACK received
TWCR |= (1<<TWINT); // Clear TWINT Flag
break;
case TW_ST_DATA_NACK: // 0xC0: data transmitted, NACK received
TWCR |= (1<<TWINT); // Clear TWINT Flag
break;
case TW_ST_LAST_DATA: // 0xC8: last data byte transmitted, ACK received
case TW_BUS_ERROR: // 0x00: illegal start or stop condition
default:
TWCR |= (1<<TWINT); // Clear TWINT Flag
break;
}
sei();
}