Почему этот зонд SAM3X8E I2C постоянно получает NACK или ARBLST?

Это код, и он должен работать, но это не так. Я все время теряю арбитраж или не признаю. Я проверил все остальное, ведомое устройство подключено и работает с другим кодом и т. Д. И т. Д.

/* Set Master Disable bit and Slave Disable bit */
TWI0->TWI_CR = TWI_CR_SVDIS;
TWI0->TWI_CR = TWI_CR_MSDIS;

/* Set Master Enable bit */
TWI0->TWI_CR = TWI_CR_MSEN;

_twi_set_speed(TWI0, 100000, 84000000);

TWI0->TWI_IER = (TWI_IER_TXRDY | TWI_IER_OVRE | TWI_IER_NACK | TWI_IER_ARBLST);

TWI0->TWI_MMR = 0;
TWI0->TWI_MMR = TWI_MMR_DADR(addr) | ((0 << TWI_MMR_IADRSZ_Pos) & TWI_MMR_IADRSZ_Msk);

TWI0->TWI_IADR = 0;

uint8_t c = 0;
int cnt = 1;
uint32_t status;
while (cnt > 0) {
  status = TWI0->TWI_SR;
  if (status & TWI_SR_NACK) {
    i2cp->errors = 12;
    return 0;
  }
  if (status & TWI_SR_ARBLST) {
    i2cp->errors = 13;
    return 0;
  }

  if (!(status & TWI_SR_TXRDY)) {
    continue;
  }
  TWI0->TWI_THR = c;

  cnt--;
}

while (1) {
  status = TWI0->TWI_SR;
  if (status & TWI_SR_NACK) {
    i2cp->errors = 10;
    return 0;
  }
  if (status & TWI_SR_ARBLST) {
    i2cp->errors = 11;
    return 0;
  }

  if (status & TWI_SR_TXRDY) {
    break;
  }
}

TWI0->TWI_CR |= TWI_CR_STOP;

while (!(TWI0->TWI_SR & TWI_SR_TXCOMP)) {
}

0 ответов

Другие вопросы по тегам