MQX 3.8.1 I2C Master mode question

Showing results for 
Search instead for 
Did you mean: 

MQX 3.8.1 I2C Master mode question

Contributor III


I meet some problem when I use MQX I2C.

The environment is [MQX3.8.1] & [CW10.2].

I2C mode is master mode.



I would like to read one byte, but it transmit 2 bytes.

I have searched the information on this forum, there is a similar issue to mine. But it's happened in MQC 3.6.0 and slave mode. The code seems not the same, so I can't fix my issue with the solution.

please refer:  I2C Slave sample code


In _ki2c_polled_rx_tx funtion, there is a dummy read after send the receive requested, is it necessary?

Because this dummy read so I always see the extra waveform from my oscilloscope. I'm not familiar with I2C driver, don't know how to fix this issue.

(location-> C:\Program Files\Freescale\Freescale MQX 3.8\mqx\source\io\i2c\polled\i2c_pol_ki2c.c)



When I call I2C_ReadByte(0x34,0x26). Although it transmit 2 bytes after the receive request, I can get the right return value : 0x0E, and the data/clock bus are fine(all high).



But when I call I2C_ReadByte(0x34,0x27), I can't get the return value, cause the data bus keep low after the sceond byte is read.



Why it's different result when I call the same funtion?

I have tried many address/offset, only I2C_ReadByte(0x34,0x26) can retrun the right value so far.



the attached file: I2C.c is my code that refer to the sample code and document. In this file, only the I2C_WriteByte function is OK. If any one familiar with I2C, please help me to check is it any problem with my code? Thank you very much.


Thank you in advance.



Original Attachment has been moved to:

Tags (2)
0 Kudos
1 Reply

Contributor III

one more question:

in i2c_pol_ki2c.c


371      case IO_IOCTL_I2C_SET_RX_REQUEST:

372         if (NULL == param_ptr)

373         {

374            result = I2C_ERROR_INVALID_PARAMETER;

375         }

376         else

377         {

378            io_info_ptr->RX_REQUEST = *param_ptr;

379         }

380         break;


After I set IO_IOCTL_I2C_SET_RX_REQUEST, the value of io_info_ptr->RX_REQUEST is 0x081FFF01 or 0x0281FFF01 or 0xC81FFF01(not the same every time). Should be this value?

in _ki2c_polled_rx_tx function, because the value is never equal to zero, so the code is never be executed.


801    if (0 == io_info_ptr->RX_REQUEST)

802    {

803        i2c_ptr->C1 &= (~ I2C_C1_TX_MASK);

804        io_info_ptr->STATE = I2C_STATE_FINISHED;

805        length = i + 1;

806        i = length;

807    }


Should I do another setting before I send IO_IOCTL_I2C_SET_RX_REQUEST?

I thought this value should be 0 or 1. not this huge one.

Thank you very much.


0 Kudos