Receiving arbitrary number of bytes as I2C slave

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

Receiving arbitrary number of bytes as I2C slave

ソリューションへジャンプ
1,521件の閲覧回数
kevinlfw
Contributor III

I'm implementing a "passthrough" functionality with the K22 acting as a slave.  Essentially I take some USB data in, strip the protocol extras, and pass the payload over to the I2C line.  In return, the Master will send data back to the K22 slave, and that will be packetized, and send back over USB.

 

My question is, since I don't necessarily know how many bytes the master is going to send back to me, what is the best method to receive an arbitrary number of bytes from a master? 

 

I do know the maximum amount of bytes the master can send to me.  So would the best method be something like this:

 

uint32_t currTimeMs;
uint32_t remainingRx;
uint32_t numUsbTx;
uint32_t timeout = OSA_TimeGetMsec() + I2C_RX_TX_TIMEOUT;

i2cStatus = I2C_DRV_SlaveReceiveData(I2C_RTOS_SLAVE_INSTANCE, usbTxBuff, MAX_PAYLOAD_SIZE);
do
{
  i2cStatus = I2C_DRV_SlaveGetTransmitStatus(I2C_RTOS_SLAVE_INSTANCE, &remainingRx);
  currTimeMs = OSA_TimeGetMsec();
}
while(i2cStatus != kStatus_I2C_Success && timeout > currTimeMs);

numUsbTx = MAX_PAYLOAD_SIZE - remainingRx;
Usb_Send(usbTxBuff, numUsbTx);

 

 

Essentially, wait for a timeout and and send only the number of bytes that were received.  Are there any other ways?  Would this be easier with the ReceiveDataBlocking call?

ラベル(1)
タグ(3)
0 件の賞賛
返信
1 解決策
1,298件の閲覧回数
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi, Kevin,

If you do not know the byte number the I2C slave device should be received, could you use only interrupt mode? once the I2C s slave receives a byte, an interrupt is triggered, you can read the char in ISR of slave I2C, this is the triditional method.

You can refer to the example  in SDK2.0:

C:\Freescale\SDK2.0_FRDM_K64F\boards\frdmk64f\driver_examples\i2c\interrupt

Hope it can help  you

BR

Xiangjun Rong

元の投稿で解決策を見る

2 返答(返信)
1,299件の閲覧回数
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi, Kevin,

If you do not know the byte number the I2C slave device should be received, could you use only interrupt mode? once the I2C s slave receives a byte, an interrupt is triggered, you can read the char in ISR of slave I2C, this is the triditional method.

You can refer to the example  in SDK2.0:

C:\Freescale\SDK2.0_FRDM_K64F\boards\frdmk64f\driver_examples\i2c\interrupt

Hope it can help  you

BR

Xiangjun Rong

1,299件の閲覧回数
kevinlfw
Contributor III

I ended up changing the protocol so that my device will know how many bytes it should receive.  The suggestion you made, and the change I made (providing the device with the number of bytes to receive), I'm assuming are the only possibilities available.  Thanks!

0 件の賞賛
返信