PSoC5LPのUSBFSについて

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
TeMa_2997106
Level 6
Level 6
Distributor - TED (Japan)
10 likes received 10 solutions authored 250 replies posted

USBFSを用いてUSBUARTを実現しようとしています。

USBUART_DataIsReady()の戻り値をチェックしてから

USBUART_GetAll()でデータを取得しようとしていますが、

前段からデータが送られている最中(複数バイトのパケットを送っているそのパケットの途中で)

USBUART_DataIsReady()を呼ぶと、戻り値は0以外になる、という認識で正しいでしょうか。

どのタイミングで「受信データ」の有無を内部で決めているか、が本質だと思いますが、

データシート上ではZero-length packetにも言及されているので、

何かしらの受信をした瞬間にもうそこで受信データと判断して戻り値は0以外になる、

と判断しました。

以上です。

0 件の賞賛
1 解決策
NoriTan
Employee
Employee
25 sign-ins 5 questions asked 10 sign-ins

USBUART の実装をご覧になるとわかりますが、 USBUART_DataIsReady() では、 End-Point (EP) の状態をチェックしているにすぎません。 EP にデータパケットが到着していれば、 non-zero を返します。

USB では、 EP にパケットが到着した状態では、次のホストのデータ送信要求に対しては NAK を返し、パケットの受け取りを拒否します。そして、次のデータの受信が可能になったら要求に対して ACK を返すようになります。この ACK を返すようにするための操作は、 USBUART_GetAll() で呼び出されている USBUART_ReadOutEP() に有ります。

従って、データが送られている最中に USBUART_DataIsReady() が呼び出された場合、データが到着していないので USBUART_DataIsReady() は zero を返します。この状態は、データを受信し終わるまで続き、パケットを受信し終わったときに non-zero を返すようになります。

Regards,

Noriaki

元の投稿で解決策を見る

2 返答(返信)
NoriTan
Employee
Employee
25 sign-ins 5 questions asked 10 sign-ins

USBUART の実装をご覧になるとわかりますが、 USBUART_DataIsReady() では、 End-Point (EP) の状態をチェックしているにすぎません。 EP にデータパケットが到着していれば、 non-zero を返します。

USB では、 EP にパケットが到着した状態では、次のホストのデータ送信要求に対しては NAK を返し、パケットの受け取りを拒否します。そして、次のデータの受信が可能になったら要求に対して ACK を返すようになります。この ACK を返すようにするための操作は、 USBUART_GetAll() で呼び出されている USBUART_ReadOutEP() に有ります。

従って、データが送られている最中に USBUART_DataIsReady() が呼び出された場合、データが到着していないので USBUART_DataIsReady() は zero を返します。この状態は、データを受信し終わるまで続き、パケットを受信し終わったときに non-zero を返すようになります。

Regards,

Noriaki

TeMa_2997106
Level 6
Level 6
Distributor - TED (Japan)
10 likes received 10 solutions authored 250 replies posted

素早いご返信ありがとうございます。

挙動について、理解できました。

0 件の賞賛