@@ -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,138 @@ 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+ PLAT_UI16 swapped_received_crc = (received_crc [0 ] << 8 ) + received_crc [1 ];
212209
213- /* ======================================================= */
214- /* ========= Receive the frame in frame elements ========= */
210+ #ifdef STSE_FRAME_DEBUG_LOG
211+ printf ("\n\r STSAFE Frame < (%d-byte) : { 0x%02X } { 0x%02X 0x%02X }\n\r" ,
212+ received_length + STSE_FRAME_CRC_SIZE ,
213+ received_header ,
214+ received_crc [0 ],
215+ received_crc [1 ]);
216+ #endif /* STSE_FRAME_DEBUG_LOG */
215217
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 );
218+ /* - Verify CRC */
219+ if (computed_crc != swapped_received_crc ) {
220+ return (STSE_SERVICE_FRAME_CRC_ERROR );
221+ }
224222
225- if (ret != STSE_OK ) {
226- retry_count -- ;
227- stse_platform_Delay_ms (STSE_POLLING_RETRY_INTERVAL );
223+ ret = (stse_ReturnCode_t )(received_header & STSE_STSAFEA_RSP_STATUS_MASK );
224+ } else {
225+ /* ======================================================= */
226+ /* ====== Format the frame to handle CRC and filler ====== */
227+
228+ /* - Compare STSAFE Received frame length with local RSP Frame length */
229+ if (received_length > pFrame -> length ) {
230+ /* Calculate needed filler to match both length */
231+ filler_size = received_length - pFrame -> length ;
232+ }
233+ if (received_length < pFrame -> length ) {
234+ pFrame -> length = received_length ;
228235 }
229- }
230236
231- /* - Verify correct reception*/
232- if (ret != STSE_OK ) {
233- return ret ;
234- }
237+ /* Append filler frame element even if its length equal 0 */
238+ PLAT_UI8 filler [filler_size ];
239+ stse_frame_element_allocate (eFiller ,
240+ filler_size ,
241+ filler );
242+ if (filler_size > 0 ) {
243+ stse_frame_push_element (pFrame ,
244+ & eFiller );
245+ }
235246
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 );
247+ /* ======================================================= */
248+ /* ========= Receive the frame in frame elements ========= */
249+
250+ ret = STSE_PLATFORM_BUS_ACK_ERROR ;
251+ while ((retry_count != 0 ) && (ret == STSE_PLATFORM_BUS_ACK_ERROR )) {
252+ /* - Receive frame length from target STSAFE */
253+ ret = pSTSE -> io .BusRecvStart (
254+ pSTSE -> io .busID ,
255+ pSTSE -> io .Devaddr ,
256+ pSTSE -> io .BusSpeed ,
257+ STSE_FRAME_LENGTH_SIZE + received_length + STSE_FRAME_CRC_SIZE );
258+
259+ if (ret != STSE_OK ) {
260+ retry_count -- ;
261+ stse_platform_Delay_ms (STSE_POLLING_RETRY_INTERVAL );
262+ }
263+ }
243264
244- if (ret != STSE_OK ) {
245- return ret ;
246- }
265+ /* - Verify correct reception*/
266+ if (ret != STSE_OK ) {
267+ return ret ;
268+ }
247269
248- /* Substract response header already read in STSAFE-A */
249- received_length -= STSE_RSP_FRAME_HEADER_SIZE ;
270+ /* Receive response header */
271+ ret = pSTSE -> io .BusRecvContinue (
272+ pSTSE -> io .busID ,
273+ pSTSE -> io .Devaddr ,
274+ pSTSE -> io .BusSpeed ,
275+ pFrame -> first_element -> pData ,
276+ STSE_RSP_FRAME_HEADER_SIZE );
250277
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- }
278+ if (ret != STSE_OK ) {
279+ return ret ;
280+ }
261281
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 ) ;
282+ /* Substract response header already read in STSAFE-A */
283+ received_length -= STSE_RSP_FRAME_HEADER_SIZE ;
264284
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 */
285+ /* Receive and discard length (already stored) */
268286 ret = pSTSE -> io .BusRecvContinue (
269287 pSTSE -> io .busID ,
270288 pSTSE -> io .Devaddr ,
271289 pSTSE -> io .BusSpeed ,
272- pFrame -> first_element -> pData + STSE_RSP_FRAME_HEADER_SIZE ,
273- pFrame -> first_element -> length - STSE_RSP_FRAME_HEADER_SIZE );
290+ NULL ,
291+ STSE_FRAME_LENGTH_SIZE );
274292 if (ret != STSE_OK ) {
275293 return ret ;
276294 }
277- }
278295
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 ;
296+ /* - Append CRC element to the RSP Frame (valid only in Receive Scope) */
297+ stse_frame_element_allocate_push (pFrame , eCRC , STSE_FRAME_CRC_SIZE , received_crc );
298+
299+ /* If first element is longer than just the header */
300+ if (pFrame -> first_element -> length > STSE_RSP_FRAME_HEADER_SIZE ) {
301+ /* Receive missing bytes after discarding the 2 bytes length */
302+ ret = pSTSE -> io .BusRecvContinue (
303+ pSTSE -> io .busID ,
304+ pSTSE -> io .Devaddr ,
305+ pSTSE -> io .BusSpeed ,
306+ pFrame -> first_element -> pData + STSE_RSP_FRAME_HEADER_SIZE ,
307+ pFrame -> first_element -> length - STSE_RSP_FRAME_HEADER_SIZE );
308+ if (ret != STSE_OK ) {
309+ return ret ;
310+ }
284311 }
285- ret = pSTSE -> io .BusRecvContinue (
312+
313+ /* - Perform frame element reception and populate local RSP Frame */
314+ pCurrent_element = pFrame -> first_element -> next ;
315+ while (pCurrent_element != pFrame -> last_element ) {
316+ if (received_length < pCurrent_element -> length ) {
317+ pCurrent_element -> length = received_length ;
318+ }
319+ ret = pSTSE -> io .BusRecvContinue (
320+ pSTSE -> io .busID ,
321+ pSTSE -> io .Devaddr ,
322+ pSTSE -> io .BusSpeed ,
323+ pCurrent_element -> pData ,
324+ pCurrent_element -> length );
325+ if (ret != STSE_OK ) {
326+ return ret ;
327+ }
328+
329+ received_length -= pCurrent_element -> length ;
330+ pCurrent_element = pCurrent_element -> next ;
331+ }
332+
333+ ret = pSTSE -> io .BusRecvStop (
286334 pSTSE -> io .busID ,
287335 pSTSE -> io .Devaddr ,
288336 pSTSE -> io .BusSpeed ,
@@ -292,48 +340,36 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
292340 return ret ;
293341 }
294342
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-
308343#ifdef STSE_FRAME_DEBUG_LOG
309- printf ("\n\r STSAFE Frame < " );
310- stse_frame_debug_print (pFrame );
311- printf ("\n\r" );
344+ printf ("\n\r STSAFE Frame < " );
345+ stse_frame_debug_print (pFrame );
346+ printf ("\n\r" );
312347#endif /* STSE_FRAME_DEBUG_LOG */
313348
314- /* - Swap CRC */
315- stse_frame_element_swap_byte_order (& eCRC );
349+ /* - Swap CRC */
350+ stse_frame_element_swap_byte_order (& eCRC );
316351
317- /* - Pop CRC element from Frame*/
318- stse_frame_pop_element (pFrame );
352+ /* - Pop CRC element from Frame*/
353+ stse_frame_pop_element (pFrame );
319354
320- /* - Compute CRC */
321- ret = stse_frame_crc16_compute (pFrame , & computed_crc );
322- if (ret != STSE_OK ) {
323- return ret ;
324- }
355+ /* - Compute CRC */
356+ ret = stse_frame_crc16_compute (pFrame , & computed_crc );
357+ if (ret != STSE_OK ) {
358+ return ret ;
359+ }
325360
326- /* - Pop Filler element from Frame*/
327- if (filler_size > 0 ) {
328- stse_frame_pop_element (pFrame );
329- }
361+ /* - Pop Filler element from Frame*/
362+ if (filler_size > 0 ) {
363+ stse_frame_pop_element (pFrame );
364+ }
330365
331- /* - Verify CRC */
332- if (computed_crc != * (PLAT_UI16 * )received_crc ) {
333- return (STSE_SERVICE_FRAME_CRC_ERROR );
334- }
366+ /* - Verify CRC */
367+ if (computed_crc != * (PLAT_UI16 * )received_crc ) {
368+ return (STSE_SERVICE_FRAME_CRC_ERROR );
369+ }
335370
336- ret = (stse_ReturnCode_t )(pFrame -> first_element -> pData [0 ] & STSE_STSAFEA_RSP_STATUS_MASK );
371+ ret = (stse_ReturnCode_t )(pFrame -> first_element -> pData [0 ] & STSE_STSAFEA_RSP_STATUS_MASK );
372+ }
337373
338374 return ret ;
339375}
0 commit comments