int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i, status; status = i2c_start(obj); if ((status != 0x10) && (status != 0x08)) { i2c_stop(obj); return status; } status = i2c_do_write(obj, (address & 0xFE)); if (status != 0x18) { i2c_stop(obj); return status; } for (i=0; i<length; i++) { status = i2c_do_write(obj, data[i]); if(status != 0x28) { i2c_stop(obj); return status; } } i2c_clear_SI(obj); if (stop) { if(i2c_stop(obj) == 1) return 1; } return 0; }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i, status; i2c_start(obj); status = i2c_do_write(obj, (address & 0xFE), 1); if (status != 0x02) { i2c_stop(obj); return I2C_ERROR_NO_SLAVE; } for (i=0; i<length; i++) { status = i2c_do_write(obj, data[i], 0); if (status != 0x02) { i2c_stop(obj); return i; } } // If not repeated start, send stop. if (stop) { i2c_stop(obj); } else { repeated_start = 1; } return length; }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i; if (i2c_start(obj)) { i2c_stop(obj); return I2C_ERROR_BUS_BUSY; } if (i2c_do_write(obj, (address & 0xFE))) { i2c_stop(obj); return I2C_ERROR_NO_SLAVE; } for (i = 0; i < length; i++) { if(i2c_do_write(obj, data[i])) { i2c_stop(obj); return i; } } if (stop) { i2c_stop(obj); } return length; }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i, status; status = i2c_start(obj); if ((status != 0x10) && (status != 0x08)) { i2c_stop(obj); return status; } status = i2c_do_write(obj, (address & 0xFE), 1); if (status != 0x18) { i2c_stop(obj); return status; } for (i=0; i<length; i++) { status = i2c_do_write(obj, data[i], 0); if(status != 0x28) { i2c_stop(obj); return status; } } i2c_clear_SI(obj); // If not repeated start, send stop. if (stop) { i2c_stop(obj); } return 0; }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i, status; status = i2c_start(obj); if ((status != 0x10) && (status != 0x08)) { i2c_stop(obj); return I2C_ERROR_BUS_BUSY; } status = i2c_do_write(obj, (address & 0xFE), 1); if (status != 0x18) { i2c_stop(obj); return I2C_ERROR_NO_SLAVE; } for (i=0; i<length; i++) { status = i2c_do_write(obj, data[i], 0); if(status != 0x28) { i2c_stop(obj); return i; } } // clearing the serial interrupt here might cause an unintended rewrite of the last byte // see also issue report https://mbed.org/users/mbed_official/code/mbed/issues/1 // i2c_clear_SI(obj); // If not repeated start, send stop. if (stop) { i2c_stop(obj); } return length; }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i; if (i2c_start(obj)) { i2c_stop(obj); return 1; } if (i2c_do_write(obj, (address & 0xFE))) { i2c_stop(obj); return 1; } for (i = 0; i < length; i++) { if(i2c_do_write(obj, data[i])) { i2c_stop(obj); return 1; } } if (stop) { i2c_stop(obj); } return 0; }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int cnt; int status; /* There is a STOP condition for last processing */ if (obj->last_stop_flag != 0) { status = i2c_start(obj); if (status != 0) { i2c_set_err_noslave(obj); return I2C_ERROR_BUS_BUSY; } } obj->last_stop_flag = stop; /* Send Slave address */ status = i2c_do_write(obj, address); if (status != 0) { i2c_set_err_noslave(obj); return I2C_ERROR_NO_SLAVE; } /* Wait send end */ status = i2c_wait_TEND(obj); if ((status != 0) || ((REG(SR2.UINT32) & SR2_NACKF) != 0)) { /* Slave sends NACK */ i2c_set_err_noslave(obj); return I2C_ERROR_NO_SLAVE; } /* Send Write data */ for (cnt=0; cnt<length; cnt++) { status = i2c_do_write(obj, data[cnt]); if(status != 0) { i2c_set_err_noslave(obj); return cnt; } else { /* Wait send end */ status = i2c_wait_TEND(obj); if ((status != 0) || ((REG(SR2.UINT32) & SR2_NACKF) != 0)) { /* Slave sends NACK */ i2c_set_err_noslave(obj); return I2C_ERROR_NO_SLAVE; } } } /* If not repeated start, send stop. */ if (stop) { (void)i2c_set_STOP(obj); (void)i2c_wait_STOP(obj); i2c_set_SR2_NACKF_STOP(obj); } else { (void)i2c_restart(obj); (void)i2c_wait_START(obj); /* SR2.START = 0 */ REG(SR2.UINT32) &= ~SR2_START; } return length; }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i, status; // full reset i2c_reg_reset(obj); status = i2c_start(obj); if ((status == 0xff)) { i2c_stop(obj); i2c_wait_STOP(obj); return I2C_ERROR_BUS_BUSY; } /**/ status = REG(CR2.UINT32); status = REG(SR2.UINT32); /**/ status = i2c_do_write(obj, address); if (status & 0x10) { i2c_stop(obj); i2c_wait_STOP(obj); return I2C_ERROR_NO_SLAVE; } /**/ status = REG(CR2.UINT32); status = REG(SR2.UINT32); /**/ for (i=0; i<length; i++) { /**/ status = REG(CR2.UINT32); status = REG(SR2.UINT32); /**/ status = i2c_do_write(obj, data[i]); if(status & 0x10) { i2c_stop(obj); i2c_wait_STOP(obj); return i; } } i2c_wait_TEND(obj); // If not repeated start, send stop. if (stop) { i2c_stop(obj); i2c_wait_STOP(obj); } return length; }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int status, errorResult; obj->i2c->ADDRESS = (address >> 1); obj->i2c->SHORTS = 0; obj->i2c->TASKS_STARTTX = 1; for (int i = 0; i<length; i++) { status = i2c_do_write(obj, data[i]); if (status) { i2c_reset(obj); errorResult = checkError(obj); if (errorResult<0) { return errorResult; } return i; } } // If not repeated start, send stop. if (stop) { if (i2c_stop(obj)) { return I2C_ERROR_NO_SLAVE; } } return length; }
int i2c_slave_write(i2c_t *obj, const char *data, int length) { int count = 0; int status = 0; if(length <= 0) { return 0; } while ((count < length) && (status == 0)) { status = i2c_do_write(obj, data[count]); count++; } if (status == 0) { /* Wait send end */ status = i2c_wait_TEND(obj); if (status != 0) { i2c_set_err_noslave(obj, 1); return 0; } } /* dummy read */ (void)REG(DRR.UINT32); (void)i2c_wait_STOP(obj); i2c_set_SR2_NACKF_STOP(obj); return count; }
int i2c_slave_write(i2c_t *obj, const char *data, int length) { int count = 0; int status = 0; if(length <= 0) { return 0; } while ((count < length) && (status == 0)) { status = i2c_do_write(obj, data[count]); if(status == 0) { /* Wait send end */ status = i2c_wait_TEND(obj); if ((status != 0) || ((count < (length - 1)) && ((REG(SR2.UINT32) & SR2_NACKF) != 0))) { /* NACK */ break; } } count++; } /* dummy read */ (void)REG(DRR.UINT32); (void)i2c_wait_STOP(obj); i2c_set_SR2_NACKF_STOP(obj); return count; }
int i2c_byte_write(i2c_t *obj, int data) { int ack = 0; int status; int timeout = 0; status = i2c_do_write(obj, (data & 0xFF)); if (status != 0) { i2c_set_SR2_NACKF_STOP(obj); } else { while (((i2c_status(obj) & SR2_RDRF) == 0) && ((i2c_status(obj) & SR2_TEND) == 0)) { timeout++; if (timeout >= WAIT_TIMEOUT) { return ack; } } /* check ACK/NACK */ if ((REG(SR2.UINT32) & SR2_NACKF) != 0) { /* NACK */ i2c_set_SR2_NACKF_STOP(obj); } else { ack = 1; } } return ack; }
static void i2c_tx_irq(IRQn_Type irq_num, uint32_t index) { i2c_t *obj = i2c_data[index].async_obj; if ((REG(SR2.UINT32) & SR2_NACKF)) { /* Slave sends NACK */ i2c_set_err_noslave(obj); i2c_data[index].event = I2C_EVENT_ERROR | I2C_EVENT_TRANSFER_EARLY_NACK; i2c_abort_asynch(obj); ((void (*)())i2c_data[index].async_callback)(); return; } if (obj->tx_buff.pos == obj->tx_buff.length) { /* All datas have tranferred */ /* Clear TEND */ REG(SR2.UINT32) &= ~(SR2_TEND); /* If not repeated start, send stop. */ if (i2c_data[index].shouldStop && obj->rx_buff.length == 0) { (void)i2c_set_STOP(obj); (void)i2c_wait_STOP(obj); i2c_set_SR2_NACKF_STOP(obj); i2c_transfer_finished(obj); } else { (void)i2c_restart(obj); (void)i2c_wait_START(obj); /* SR2.START = 0 */ REG(SR2.UINT32) &= ~SR2_START; if (obj->rx_buff.length) { /* Ready to read */ i2c_set_MR3_ACK(obj); /* Disable INTRIICTEI */ REG(IER.UINT8[0]) &= ~(1 << 6); /* Send Slave address */ if (i2c_read_address_write(obj, (i2c_data[index].address | 0x01)) != 0) { i2c_set_err_noslave(obj); i2c_data[index].event = I2C_EVENT_ERROR | I2C_EVENT_ERROR_NO_SLAVE; i2c_abort_asynch(obj); ((void (*)())i2c_data[index].async_callback)(); return; } } else { i2c_transfer_finished(obj); } } } else { /* Send next 1 byte */ if (i2c_do_write(obj, *(uint8_t *)obj->tx_buff.buffer) != 0) { i2c_set_err_noslave(obj); i2c_data[index].event = I2C_EVENT_ERROR | I2C_EVENT_ERROR_NO_SLAVE; i2c_abort_asynch(obj); ((void (*)())i2c_data[index].async_callback)(); return; } obj->tx_buff.buffer = (uint8_t *)obj->tx_buff.buffer + 1; ++obj->tx_buff.pos; } }
//New version WH, Tested OK for Start and Repeated Start //Old version was Wrong: Calls i2c_start without setting address first int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i, status; //Store the address+/WR and then generate STA I2C_DAT(obj) = address & 0xFE; i2c_start(obj); // Wait for completion of STA and Sending of SlaveAddress+/WR i2c_wait_SI(obj); status = i2c_status(obj); if (status == 0x03) { // NAK SlaveAddress i2c_stop(obj); return I2C_ERROR_NO_SLAVE; } //Write all bytes for (i=0; i<length; i++) { status = i2c_do_write(obj, data[i], 0); if (status != 0x02) { // TX RDY. Handles a Slave NAK on datawrite i2c_stop(obj); return i; } } // If not repeated start, send stop. if (stop) { i2c_stop(obj); } else { repeated_start = 1; } return length; }
int i2c_byte_write(i2c_t *obj, int data) { uint32_t i2c_addrs[] = I2C_BASE_ADDRS; // set tx mode I2C_HAL_SetDirMode(i2c_addrs[obj->instance], kI2CSend); return !i2c_do_write(obj, (data & 0xFF)); }
int i2c_byte_write(i2c_t *obj, int data) { i2c_do_write(obj, (data & 0xFF), 0); i2c_wait_send(obj); // TODO: Should return whether write has been acknowledged return 1; }
int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { int count; i2c_start(obj); // Send the slave address i2c_do_write(obj, (address | 0x01), 1); // Wait until we have transmitted and the ADDR byte is set i2c_wait_addr_rx(obj); // Read in all except last byte for (count = 0; count < (length - 1); count++) { int value = i2c_do_read(obj, 0); data[count] = (char) value; } // read in last byte int value = i2c_do_read(obj, 1); data[count] = (char) value; // If not repeated start, send stop. if (stop) { i2c_stop(obj); } return length; }
int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len) { int rc = i2c_do_write(chip, addr, alen, buffer, len); i2c_stop(); return rc; }
int i2c_byte_write(i2c_t *obj, int data) { first_read = 1; // set tx mode obj->i2c->C1 |= I2C_C1_TX_MASK; return !i2c_do_write(obj, (data & 0xFF)); }
int i2c_byte_write(i2c_t *obj, int data) { int ack; int status = i2c_do_write(obj, (data & 0xFF)); if (status & NACKF) { ack = 0; } else { ack = 1; } return ack; }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i; i2c_start(obj); // Send the slave address i2c_do_write(obj, (address & 0xFE), 1); i2c_wait_addr_tx(obj); for (i=0; i<length; i++) { i2c_do_write(obj, data[i], 0); i2c_wait_send(obj); } // If not repeated start, send stop. if (stop) { i2c_stop(obj); } return length; }
void i2c_transfer_asynch(i2c_t *obj, const void *tx, size_t tx_length, void *rx, size_t rx_length, uint32_t address, uint32_t stop, uint32_t handler, uint32_t event, DMAUsage hint) { MBED_ASSERT(obj); MBED_ASSERT(tx ? tx_length : 1); MBED_ASSERT(rx ? rx_length : 1); MBED_ASSERT((REG(SER.UINT32) & SER_SAR0E) == 0); /* Slave mode */ obj->tx_buff.buffer = (void *)tx; obj->tx_buff.length = tx_length; obj->tx_buff.pos = 0; obj->tx_buff.width = 8; obj->rx_buff.buffer = rx; obj->rx_buff.length = rx_length; obj->rx_buff.pos = SIZE_MAX; obj->rx_buff.width = 8; i2c_data[obj->i2c.i2c].async_obj = obj; i2c_data[obj->i2c.i2c].async_callback = handler; i2c_data[obj->i2c.i2c].event = 0; i2c_data[obj->i2c.i2c].shouldStop = stop; i2c_data[obj->i2c.i2c].address = address; i2c_irqs_set(obj, 1); /* There is a STOP condition for last processing */ if (obj->i2c.last_stop_flag != 0) { if (i2c_start(obj) != 0) { i2c_set_err_noslave(obj); i2c_data[obj->i2c.i2c].event = I2C_EVENT_ERROR | I2C_EVENT_ERROR_NO_SLAVE; i2c_abort_asynch(obj); ((void (*)())handler)(); return; } } obj->i2c.last_stop_flag = stop; if (rx_length && tx_length == 0) { /* Ready to read */ i2c_set_MR3_ACK(obj); /* Disable INTRIICTEI */ REG(IER.UINT8[0]) &= ~(1 << 6); address |= 0x01; } /* Send Slave address */ if (i2c_do_write(obj, address) != 0) { i2c_set_err_noslave(obj); i2c_data[obj->i2c.i2c].event = I2C_EVENT_ERROR | I2C_EVENT_ERROR_NO_SLAVE; i2c_abort_asynch(obj); ((void (*)())handler)(); return; } }
int i2c_byte_write(i2c_t *obj, int data) { int ack; int status; status = i2c_do_write(obj, (data & 0xFF)); if (status != 0) { i2c_set_err_noslave(obj, 1); ack = 0; } else { ack = 1; } return ack; }
int i2c_byte_write(i2c_t *obj, int data) { int ack; int status = i2c_do_write(obj, (data & 0xFF), 0); switch(status) { case 2: // TX RDY. Handles a Slave NAK on datawrite ack = 1; break; default: ack = 0; break; } return ack; }
int i2c_byte_write(i2c_t *obj, int data) { int ack; int status = i2c_do_write(obj, (data & 0xFF), 0); switch(status) { case 2: ack = 1; break; default: ack = 0; break; } return ack; }
int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { int count, status; status = i2c_start(obj); if ((status != 0x10) && (status != 0x08)) { i2c_stop(obj); return status; } status = i2c_do_write(obj, (address | 0x01)); if (status != 0x40) { i2c_stop(obj); return status; } // Read in all except last byte for (count = 0; count < (length - 1); count++) { int value = i2c_do_read(obj, 0); status = i2c_status(obj); if (status != 0x50) { i2c_stop(obj); return status; } data[count] = (char) value; } // read in last byte int value = i2c_do_read(obj, 1); status = i2c_status(obj); if (status != 0x58) { i2c_stop(obj); return status; } data[count] = (char) value; // If not repeated start, send stop. if (stop) { if(i2c_stop(obj) == 1) return 1; } return 0; }
int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { int count, status; i2c_start(obj); status = i2c_do_write(obj, (address | 0x01), 1); if (status != 0x01) { i2c_stop(obj); return I2C_ERROR_NO_SLAVE; } // Read in all except last byte for (count = 0; count < (length - 1); count++) { int value = i2c_do_read(obj, 0); status = i2c_status(obj); if (status != 0x00) { i2c_stop(obj); return count; } data[count] = (char) value; } // read in last byte int value = i2c_do_read(obj, 1); status = i2c_status(obj); if (status != 0x01) { i2c_stop(obj); return length - 1; } data[count] = (char) value; // If not repeated start, send stop. if (stop) { i2c_stop(obj); } else { repeated_start = 1; } return length; }
int i2c_byte_write(i2c_t *obj, int data) { int ack; int status = i2c_do_write(obj, (data & 0xFF), 0); switch(status) { case 0x18: case 0x28: // Master transmit ACKs ack = 1; break; case 0x40: // Master receive address transmitted ACK ack = 1; break; case 0xB8: // Slave transmit ACK ack = 1; break; default: ack = 0; break; } return ack; }
int i2c_slave_write(i2c_t *obj, const char *data, int length) { int count = 0; int status; if(length <= 0) { return(0); } do { status = i2c_do_write(obj, data[count], 0); count++; } while ((count < length) && (status == 0xB8)); if ((status != 0xC0) && (status != 0xC8)) { i2c_stop(obj); } i2c_clear_SI(obj); return(count); }
int i2c_slave_write(i2c_t *obj, const char *data, int length) { int count = 0; int status; if(length <= 0) { return(0); } do { status = i2c_do_write(obj, data[count]); count++; } while ((count < length) && !(status & 0x10)); if (!(status & 0x10)) { i2c_stop(obj); i2c_wait_STOP(obj); } i2c_clear_TDRE(obj); return(count); }