Hi,
I have configure my I2C slave as follow:
bool ini_i2c(void)
{
i2c_slave_config_t slaveConfig;
status_t reVal = kStatus_Fail;
/* Set up i2c slave */
I2C_SlaveGetDefaultConfig(&slaveConfig);
/* Change the slave address */
slaveConfig.address0.address = I2C_MASTER_SLAVE_ADDR_7BIT;
/* Initialize the I2C slave peripheral */
I2C_SlaveInit(EXAMPLE_I2C_SLAVE, &slaveConfig, I2C_SLAVE_CLOCK_FREQUENCY);
memset(g_slave_buff, 0, sizeof(g_slave_buff));
/* Create the I2C handle for the non-blocking transfer */
I2C_SlaveTransferCreateHandle(I2C0, &g_s_handle, i2c_slave_callback, NULL);
NVIC_SetPriority(I2C0_IRQn, 2);
/* Start accepting I2C transfers on the I2C slave peripheral */
reVal = I2C_SlaveTransferNonBlocking(I2C0, &g_s_handle,
kI2C_SlaveAddressMatchEvent | kI2C_SlaveCompletionEvent);
if (reVal != kStatus_Success)
{
return -1;
}
return 0;
}
Then, in the callback function I do following:
const uint8_t dat = 0;
uint8_t g_slave_buff[8];
static void i2c_slave_callback(I2C_Type *base, volatile i2c_slave_transfer_t *xfer, void *userData)
{
switch (xfer->event)
{
/* Address match event */
case kI2C_SlaveAddressMatchEvent: // Received the slave address after a start or repeated start.
xfer->rxData = NULL;
xfer->rxSize = 0;
xfer->txData = NULL;
xfer->txSize = 0;
break;
/* Transmit request */
case kI2C_SlaveTransmitEvent: // Callback is requested to provide data to transmit (slave-transmitter role).
switch (g_slave_buff[0])
{
case 0xA0:
if (dat != 0) Toogle_TEST();
xfer->txData = &dat;
xfer->txSize = 1;
}
break;
/* Setup the slave receive buffer */
case kI2C_SlaveReceiveEvent: // Callback is requested to provide a buffer in which to place received data (slave-receiver role).
xfer->rxData = g_slave_buff;
xfer->rxSize = I2C_DATA_LENGTH;
break;
}
}
It works as expected, but sometimes I can see that 0x00 data is not transmitted and instead of it I see 0x01 data is sent. The issue happens randomly. What could be the reason ?
I attach a graph showing undesired 0x01 sending.
Thanks,
Asier.
Solved! Go to Solution.
It seems that It was not a software problem. Changing values of resistor pull-ups from 4K7 to 1K in SCL and SDA lines issue is solved.
Thanks you,
Asier.
Sorry, but in the graph TEST signal (trace in red) is toogling because "const uint8_t dat = 0;" definition produces "if (dat != 0) Toogle_TEST();" to be true.
I've checked that declaring "int8_t dat = 0;" TEST signal is not toogling when 0x01 is transmitting. So "dat" variable has correct 0 value.
It seems that It was not a software problem. Changing values of resistor pull-ups from 4K7 to 1K in SCL and SDA lines issue is solved.
Thanks you,
Asier.