Other Parts Discussed in Thread: BQ2040
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);
}









