@@ -134,15 +134,15 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
134134 return (STSE_SERVICE_INVALID_PARAMETER );
135135 }
136136
137- /* ======================================================= */
138- /* ============== Get the total frame length ============= */
137+ /* ================================================================================= */
138+ /* ============== Get the total frame length + 2 bytes (potential CRC) ============= */
139139 while ((retry_count != 0 ) && (ret == STSE_PLATFORM_BUS_ACK_ERROR )) {
140140 /* - Receive frame length from target STSAFE */
141141 ret = pSTSE -> io .BusRecvStart (
142142 pSTSE -> io .busID ,
143143 pSTSE -> io .Devaddr ,
144144 pSTSE -> io .BusSpeed ,
145- STSE_FRAME_LENGTH_SIZE + STSE_RSP_FRAME_HEADER_SIZE );
145+ STSE_FRAME_LENGTH_SIZE + STSE_RSP_FRAME_HEADER_SIZE + STSE_FRAME_CRC_SIZE );
146146
147147 if (ret != STSE_OK ) {
148148 retry_count -- ;
@@ -164,7 +164,7 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
164164 STSE_RSP_FRAME_HEADER_SIZE );
165165
166166 /* - Get STSAFE Response Length */
167- ret = pSTSE -> io .BusRecvStop (
167+ ret = pSTSE -> io .BusRecvContinue (
168168 pSTSE -> io .busID ,
169169 pSTSE -> io .Devaddr ,
170170 pSTSE -> io .BusSpeed ,
@@ -174,6 +174,17 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
174174 return ret ;
175175 }
176176
177+ /* - Get STSAFE Response Potential CRC */
178+ ret = pSTSE -> io .BusRecvStop (
179+ pSTSE -> io .busID ,
180+ pSTSE -> io .Devaddr ,
181+ pSTSE -> io .BusSpeed ,
182+ received_crc ,
183+ STSE_FRAME_CRC_SIZE );
184+ if (ret != STSE_OK ) {
185+ return ret ;
186+ }
187+
177188 /* - Store response Length */
178189 received_length = ((length_value [0 ] << 8 ) + length_value [1 ]) - STSE_FRAME_CRC_SIZE + STSE_RSP_FRAME_HEADER_SIZE ;
179190
@@ -188,101 +199,136 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
188199 }
189200 }
190201
191- /* ======================================================= */
192- /* ====== Format the frame to handle CRC and filler ====== */
202+ if (received_length == 1 ) {
203+ /* ====================================================== */
204+ /* ====== compute CRC for response without payload ====== */
193205
194- /* - Compare STSAFE Received frame length with local RSP Frame length */
195- if (received_length > pFrame -> length ) {
196- /* Calculate needed filler to match both length */
197- filler_size = received_length - pFrame -> length ;
198- }
199- if (received_length < pFrame -> length ) {
200- pFrame -> length = received_length ;
201- }
206+ computed_crc = stse_platform_Crc16_Calculate (& received_header , STSE_RSP_FRAME_HEADER_SIZE );
202207
203- /* Append filler frame element even if its length equal 0 */
204- PLAT_UI8 filler [filler_size ];
205- stse_frame_element_allocate (eFiller ,
206- filler_size ,
207- filler );
208- if (filler_size > 0 ) {
209- stse_frame_push_element (pFrame ,
210- & eFiller );
211- }
208+ #ifdef STSE_FRAME_DEBUG_LOG
209+ printf ("\n\r STSAFE Frame < (%d-byte) : { 0x%02X } { 0x%02X 0x%02X }\n\r" ,
210+ received_length + STSE_FRAME_CRC_SIZE ,
211+ received_header ,
212+ received_crc [0 ],
213+ received_crc [1 ]);
214+ #endif /* STSE_FRAME_DEBUG_LOG */
212215
213- /* ======================================================= */
214- /* ========= Receive the frame in frame elements ========= */
216+ /* - Verify CRC */
217+ if (computed_crc != ((received_crc [0 ] << 8 ) + received_crc [1 ])) {
218+ return (STSE_SERVICE_FRAME_CRC_ERROR );
219+ }
215220
216- ret = STSE_PLATFORM_BUS_ACK_ERROR ;
217- while ((retry_count != 0 ) && (ret == STSE_PLATFORM_BUS_ACK_ERROR )) {
218- /* - Receive frame length from target STSAFE */
219- ret = pSTSE -> io .BusRecvStart (
220- pSTSE -> io .busID ,
221- pSTSE -> io .Devaddr ,
222- pSTSE -> io .BusSpeed ,
223- STSE_FRAME_LENGTH_SIZE + received_length + STSE_FRAME_CRC_SIZE );
221+ ret = (stse_ReturnCode_t )(received_header & STSE_STSAFEA_RSP_STATUS_MASK );
222+ } else {
223+ /* ======================================================= */
224+ /* ====== Format the frame to handle CRC and filler ====== */
224225
225- if (ret != STSE_OK ) {
226- retry_count -- ;
227- stse_platform_Delay_ms (STSE_POLLING_RETRY_INTERVAL );
226+ /* - Compare STSAFE Received frame length with local RSP Frame length */
227+ if (received_length > pFrame -> length ) {
228+ /* Calculate needed filler to match both length */
229+ filler_size = received_length - pFrame -> length ;
230+ }
231+ if (received_length < pFrame -> length ) {
232+ pFrame -> length = received_length ;
228233 }
229- }
230234
231- /* - Verify correct reception*/
232- if (ret != STSE_OK ) {
233- return ret ;
234- }
235+ /* Append filler frame element even if its length equal 0 */
236+ PLAT_UI8 filler [filler_size ];
237+ stse_frame_element_allocate (eFiller ,
238+ filler_size ,
239+ filler );
240+ if (filler_size > 0 ) {
241+ stse_frame_push_element (pFrame ,
242+ & eFiller );
243+ }
235244
236- /* Receive response header */
237- ret = pSTSE -> io .BusRecvContinue (
238- pSTSE -> io .busID ,
239- pSTSE -> io .Devaddr ,
240- pSTSE -> io .BusSpeed ,
241- pFrame -> first_element -> pData ,
242- STSE_RSP_FRAME_HEADER_SIZE );
245+ /* ======================================================= */
246+ /* ========= Receive the frame in frame elements ========= */
247+
248+ ret = STSE_PLATFORM_BUS_ACK_ERROR ;
249+ while ((retry_count != 0 ) && (ret == STSE_PLATFORM_BUS_ACK_ERROR )) {
250+ /* - Receive frame length from target STSAFE */
251+ ret = pSTSE -> io .BusRecvStart (
252+ pSTSE -> io .busID ,
253+ pSTSE -> io .Devaddr ,
254+ pSTSE -> io .BusSpeed ,
255+ STSE_FRAME_LENGTH_SIZE + received_length + STSE_FRAME_CRC_SIZE );
256+
257+ if (ret != STSE_OK ) {
258+ retry_count -- ;
259+ stse_platform_Delay_ms (STSE_POLLING_RETRY_INTERVAL );
260+ }
261+ }
243262
244- if (ret != STSE_OK ) {
245- return ret ;
246- }
263+ /* - Verify correct reception*/
264+ if (ret != STSE_OK ) {
265+ return ret ;
266+ }
247267
248- /* Substract response header already read in STSAFE-A */
249- received_length -= STSE_RSP_FRAME_HEADER_SIZE ;
268+ /* Receive response header */
269+ ret = pSTSE -> io .BusRecvContinue (
270+ pSTSE -> io .busID ,
271+ pSTSE -> io .Devaddr ,
272+ pSTSE -> io .BusSpeed ,
273+ pFrame -> first_element -> pData ,
274+ STSE_RSP_FRAME_HEADER_SIZE );
250275
251- /* Receive and discard length (already stored) */
252- ret = pSTSE -> io .BusRecvContinue (
253- pSTSE -> io .busID ,
254- pSTSE -> io .Devaddr ,
255- pSTSE -> io .BusSpeed ,
256- NULL ,
257- STSE_FRAME_LENGTH_SIZE );
258- if (ret != STSE_OK ) {
259- return ret ;
260- }
276+ if (ret != STSE_OK ) {
277+ return ret ;
278+ }
261279
262- /* - Append CRC element to the RSP Frame (valid only in Receive Scope) */
263- stse_frame_element_allocate_push ( pFrame , eCRC , STSE_FRAME_CRC_SIZE , received_crc ) ;
280+ /* Substract response header already read in STSAFE-A */
281+ received_length -= STSE_RSP_FRAME_HEADER_SIZE ;
264282
265- /* If first element is longer than just the header */
266- if (pFrame -> first_element -> length > STSE_RSP_FRAME_HEADER_SIZE ) {
267- /* Receive missing bytes after discarding the 2 bytes length */
283+ /* Receive and discard length (already stored) */
268284 ret = pSTSE -> io .BusRecvContinue (
269285 pSTSE -> io .busID ,
270286 pSTSE -> io .Devaddr ,
271287 pSTSE -> io .BusSpeed ,
272- pFrame -> first_element -> pData + STSE_RSP_FRAME_HEADER_SIZE ,
273- pFrame -> first_element -> length - STSE_RSP_FRAME_HEADER_SIZE );
288+ NULL ,
289+ STSE_FRAME_LENGTH_SIZE );
274290 if (ret != STSE_OK ) {
275291 return ret ;
276292 }
277- }
278293
279- /* - Perform frame element reception and populate local RSP Frame */
280- pCurrent_element = pFrame -> first_element -> next ;
281- while (pCurrent_element != pFrame -> last_element ) {
282- if (received_length < pCurrent_element -> length ) {
283- pCurrent_element -> length = received_length ;
294+ /* - Append CRC element to the RSP Frame (valid only in Receive Scope) */
295+ stse_frame_element_allocate_push (pFrame , eCRC , STSE_FRAME_CRC_SIZE , received_crc );
296+
297+ /* If first element is longer than just the header */
298+ if (pFrame -> first_element -> length > STSE_RSP_FRAME_HEADER_SIZE ) {
299+ /* Receive missing bytes after discarding the 2 bytes length */
300+ ret = pSTSE -> io .BusRecvContinue (
301+ pSTSE -> io .busID ,
302+ pSTSE -> io .Devaddr ,
303+ pSTSE -> io .BusSpeed ,
304+ pFrame -> first_element -> pData + STSE_RSP_FRAME_HEADER_SIZE ,
305+ pFrame -> first_element -> length - STSE_RSP_FRAME_HEADER_SIZE );
306+ if (ret != STSE_OK ) {
307+ return ret ;
308+ }
284309 }
285- ret = pSTSE -> io .BusRecvContinue (
310+
311+ /* - Perform frame element reception and populate local RSP Frame */
312+ pCurrent_element = pFrame -> first_element -> next ;
313+ while (pCurrent_element != pFrame -> last_element ) {
314+ if (received_length < pCurrent_element -> length ) {
315+ pCurrent_element -> length = received_length ;
316+ }
317+ ret = pSTSE -> io .BusRecvContinue (
318+ pSTSE -> io .busID ,
319+ pSTSE -> io .Devaddr ,
320+ pSTSE -> io .BusSpeed ,
321+ pCurrent_element -> pData ,
322+ pCurrent_element -> length );
323+ if (ret != STSE_OK ) {
324+ return ret ;
325+ }
326+
327+ received_length -= pCurrent_element -> length ;
328+ pCurrent_element = pCurrent_element -> next ;
329+ }
330+
331+ ret = pSTSE -> io .BusRecvStop (
286332 pSTSE -> io .busID ,
287333 pSTSE -> io .Devaddr ,
288334 pSTSE -> io .BusSpeed ,
@@ -292,48 +338,36 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
292338 return ret ;
293339 }
294340
295- received_length -= pCurrent_element -> length ;
296- pCurrent_element = pCurrent_element -> next ;
297- }
298- ret = pSTSE -> io .BusRecvStop (
299- pSTSE -> io .busID ,
300- pSTSE -> io .Devaddr ,
301- pSTSE -> io .BusSpeed ,
302- pCurrent_element -> pData ,
303- pCurrent_element -> length );
304- if (ret != STSE_OK ) {
305- return ret ;
306- }
307-
308341#ifdef STSE_FRAME_DEBUG_LOG
309- printf ("\n\r STSAFE Frame < " );
310- stse_frame_debug_print (pFrame );
311- printf ("\n\r" );
342+ printf ("\n\r STSAFE Frame < " );
343+ stse_frame_debug_print (pFrame );
344+ printf ("\n\r" );
312345#endif /* STSE_FRAME_DEBUG_LOG */
313346
314- /* - Swap CRC */
315- stse_frame_element_swap_byte_order (& eCRC );
347+ /* - Swap CRC */
348+ stse_frame_element_swap_byte_order (& eCRC );
316349
317- /* - Pop CRC element from Frame*/
318- stse_frame_pop_element (pFrame );
350+ /* - Pop CRC element from Frame*/
351+ stse_frame_pop_element (pFrame );
319352
320- /* - Compute CRC */
321- ret = stse_frame_crc16_compute (pFrame , & computed_crc );
322- if (ret != STSE_OK ) {
323- return ret ;
324- }
353+ /* - Compute CRC */
354+ ret = stse_frame_crc16_compute (pFrame , & computed_crc );
355+ if (ret != STSE_OK ) {
356+ return ret ;
357+ }
325358
326- /* - Pop Filler element from Frame*/
327- if (filler_size > 0 ) {
328- stse_frame_pop_element (pFrame );
329- }
359+ /* - Pop Filler element from Frame*/
360+ if (filler_size > 0 ) {
361+ stse_frame_pop_element (pFrame );
362+ }
330363
331- /* - Verify CRC */
332- if (computed_crc != * (PLAT_UI16 * )received_crc ) {
333- return (STSE_SERVICE_FRAME_CRC_ERROR );
334- }
364+ /* - Verify CRC */
365+ if (computed_crc != * (PLAT_UI16 * )received_crc ) {
366+ return (STSE_SERVICE_FRAME_CRC_ERROR );
367+ }
335368
336- ret = (stse_ReturnCode_t )(pFrame -> first_element -> pData [0 ] & STSE_STSAFEA_RSP_STATUS_MASK );
369+ ret = (stse_ReturnCode_t )(pFrame -> first_element -> pData [0 ] & STSE_STSAFEA_RSP_STATUS_MASK );
370+ }
337371
338372 return ret ;
339373}
0 commit comments