1. I have to write I2c master code, which sequence-> Start->Address->Tx_1st_byte->Tx_2nd_byte->restart->Rx_1st_byte->Rx_2nd_byte_stop.
using Tm4c123gxl lauchpad & driverlib 2.1.1.71.
2. Have written below code for it. Haven't checked the code, since I don't have another slave or TM4C. Is the below sequence correct?
3. Line37: I have SDA OD separtely as mentioned in datsheet & left SCL as in default.
Line 77: have to send restart condition. How to do that here or API automatically do it?
What if I have to send NACK in receive? (never have such condition, but just asking is there any need for it. Suppose incorrect data appears)
uint32_t ready_count; /* enable SSI0 module */ SysCtlPeripheralDisable(SYSCTL_PERIPH_I2C0); SysCtlPeripheralReset(SYSCTL_PERIPH_I2C0); SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0); ready_count = 2000U; while( (!(SysCtlPeripheralReady(SYSCTL_PERIPH_I2C0))) && (--ready_count)); if(0U == ready_count) /* if periph not ready take action */ { } /* enable scl */ SysCtlGPIOAHBEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); ready_count = 2000U; while( (!(SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB))) && (--ready_count)); if(0U == ready_count) /* if periph not ready take action */ { } GPIOPinConfigure(GPIO_PB2_I2C0SCL); GPIOPinTypeI2C(GPIO_PORTB_AHB_BASE , GPIO_PIN_2); /* enable sda */ SysCtlGPIOAHBEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); ready_count = 2000U; while( (!(SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB))) && (--ready_count)); if(0U == ready_count) /* if periph not ready take action */ { } GPIOPinConfigure(GPIO_PB3_I2C0SDA); GPIOPinTypeI2C(GPIO_PORTB_AHB_BASE , GPIO_PIN_3); HWREG(GPIO_PORTB_AHB_BASE + GPIO_O_ODR) = HWREG(GPIO_PORTB_AHB_BASE + GPIO_O_ODR) | GPIO_PIN_3; /* make pin open drain */ /* disable i2c first */ I2CMasterDisable(I2C0_BASE); I2CMasterIntDisable(I2C0_BASE); I2CMasterIntClear(I2C0_BASE); /* i2c clock set */ I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), false); /* 100Khz */ I2CMasterTimeoutSet(I2C0_BASE , 0x7dU); /* 20ms timeout */ I2CMasterSlaveAddrSet(I2C0_BASE , 0x80U >> 1U, false); /* 7 bit address, transmit */ /* firt byte to send */ I2CMasterDataPut(I2C0_BASE , 0x01U); I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); while(I2CMasterBusy(I2C0_BASE)) {} uint32_t err; uint32_t temp[2]; err = I2CMasterErr(I2C0_BASE); if((I2C_MASTER_ERR_ADDR_ACK == err) || (I2C_MASTER_ERR_DATA_ACK == err) ) { I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP); while(1); } /* second byte send & a retart condition */ I2CMasterDataPut(I2C0_BASE , 0x02U); I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); while(I2CMasterBusy(I2C0_BASE)) {} err = I2CMasterErr(I2C0_BASE); if((I2C_MASTER_ERR_ADDR_ACK == err) || (I2C_MASTER_ERR_DATA_ACK == err) ) { I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_ERROR_STOP); while(1); } /* first byte rx & send a ack */ I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT); temp[0] = I2CMasterDataGet(I2C0_BASE); while(I2CMasterBusy(I2C0_BASE)) {} err = I2CMasterErr(I2C0_BASE); if((I2C_MASTER_ERR_ADDR_ACK == err) || (I2C_MASTER_ERR_DATA_ACK == err) ) { I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP); while(1); } /* second byte rx & send a stop */ I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH); temp[1] = I2CMasterDataGet(I2C0_BASE); while(I2CMasterBusy(I2C0_BASE)) {} err = I2CMasterErr(I2C0_BASE); if((I2C_MASTER_ERR_ADDR_ACK == err) || (I2C_MASTER_ERR_DATA_ACK == err) ) { I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP); while(1); }