@@ -132,15 +132,15 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
132132 return (STSE_SERVICE_INVALID_PARAMETER );
133133 }
134134
135- /* ======================================================= */
136- /* ============== Get the total frame length ============= */
135+ /* ================================================================================= */
136+ /* ============== Get the total frame length + 2 bytes (potential CRC) ============= */
137137 while ((retry_count != 0 ) && (ret == STSE_PLATFORM_BUS_ACK_ERROR )) {
138138 /* - Receive frame length from target STSAFE */
139139 ret = pSTSE -> io .BusRecvStart (
140140 pSTSE -> io .busID ,
141141 pSTSE -> io .Devaddr ,
142142 pSTSE -> io .BusSpeed ,
143- STSE_FRAME_LENGTH_SIZE + STSE_RSP_FRAME_HEADER_SIZE );
143+ STSE_FRAME_LENGTH_SIZE + STSE_RSP_FRAME_HEADER_SIZE + STSE_FRAME_CRC_SIZE );
144144
145145 if (ret != STSE_OK ) {
146146 retry_count -- ;
@@ -162,7 +162,7 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
162162 STSE_RSP_FRAME_HEADER_SIZE );
163163
164164 /* - Get STSAFE Response Length */
165- ret = pSTSE -> io .BusRecvStop (
165+ ret = pSTSE -> io .BusRecvContinue (
166166 pSTSE -> io .busID ,
167167 pSTSE -> io .Devaddr ,
168168 pSTSE -> io .BusSpeed ,
@@ -172,6 +172,17 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
172172 return ret ;
173173 }
174174
175+ /* - Get STSAFE Response Potential CRC */
176+ ret = pSTSE -> io .BusRecvStop (
177+ pSTSE -> io .busID ,
178+ pSTSE -> io .Devaddr ,
179+ pSTSE -> io .BusSpeed ,
180+ received_crc ,
181+ STSE_FRAME_CRC_SIZE );
182+ if (ret != STSE_OK ) {
183+ return ret ;
184+ }
185+
175186 /* - Store response Length */
176187 received_length = ((length_value [0 ] << 8 ) + length_value [1 ]) - STSE_FRAME_CRC_SIZE + STSE_RSP_FRAME_HEADER_SIZE ;
177188
@@ -186,101 +197,136 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
186197 }
187198 }
188199
189- /* ======================================================= */
190- /* ====== Format the frame to handle CRC and filler ====== */
200+ if (received_length == 1 ) {
201+ /* ====================================================== */
202+ /* ====== compute CRC for response without payload ====== */
191203
192- /* - Compare STSAFE Received frame length with local RSP Frame length */
193- if (received_length > pFrame -> length ) {
194- /* Calculate needed filler to match both length */
195- filler_size = received_length - pFrame -> length ;
196- }
197- if (received_length < pFrame -> length ) {
198- pFrame -> length = received_length ;
199- }
204+ computed_crc = stse_platform_Crc16_Calculate (& received_header , STSE_RSP_FRAME_HEADER_SIZE );
200205
201- /* Append filler frame element even if its length equal 0 */
202- PLAT_UI8 filler [filler_size ];
203- stse_frame_element_allocate (eFiller ,
204- filler_size ,
205- filler );
206- if (filler_size > 0 ) {
207- stse_frame_push_element (pFrame ,
208- & eFiller );
209- }
206+ #ifdef STSE_FRAME_DEBUG_LOG
207+ printf ("\n\r STSAFE Frame < (%d-byte) : { 0x%02X } { 0x%02X 0x%02X }\n\r" ,
208+ received_length + STSE_FRAME_CRC_SIZE ,
209+ received_header ,
210+ received_crc [0 ],
211+ received_crc [1 ]);
212+ #endif /* STSE_FRAME_DEBUG_LOG */
210213
211- /* ======================================================= */
212- /* ========= Receive the frame in frame elements ========= */
214+ /* - Verify CRC */
215+ if (computed_crc != ((received_crc [0 ] << 8 ) + received_crc [1 ])) {
216+ return (STSE_SERVICE_FRAME_CRC_ERROR );
217+ }
213218
214- ret = STSE_PLATFORM_BUS_ACK_ERROR ;
215- while ((retry_count != 0 ) && (ret == STSE_PLATFORM_BUS_ACK_ERROR )) {
216- /* - Receive frame length from target STSAFE */
217- ret = pSTSE -> io .BusRecvStart (
218- pSTSE -> io .busID ,
219- pSTSE -> io .Devaddr ,
220- pSTSE -> io .BusSpeed ,
221- STSE_FRAME_LENGTH_SIZE + received_length + STSE_FRAME_CRC_SIZE );
219+ ret = (stse_ReturnCode_t )(received_header & STSE_STSAFEA_RSP_STATUS_MASK );
220+ } else {
221+ /* ======================================================= */
222+ /* ====== Format the frame to handle CRC and filler ====== */
222223
223- if (ret != STSE_OK ) {
224- retry_count -- ;
225- stse_platform_Delay_ms (STSE_POLLING_RETRY_INTERVAL );
224+ /* - Compare STSAFE Received frame length with local RSP Frame length */
225+ if (received_length > pFrame -> length ) {
226+ /* Calculate needed filler to match both length */
227+ filler_size = received_length - pFrame -> length ;
228+ }
229+ if (received_length < pFrame -> length ) {
230+ pFrame -> length = received_length ;
226231 }
227- }
228232
229- /* - Verify correct reception*/
230- if (ret != STSE_OK ) {
231- return ret ;
232- }
233+ /* Append filler frame element even if its length equal 0 */
234+ PLAT_UI8 filler [filler_size ];
235+ stse_frame_element_allocate (eFiller ,
236+ filler_size ,
237+ filler );
238+ if (filler_size > 0 ) {
239+ stse_frame_push_element (pFrame ,
240+ & eFiller );
241+ }
233242
234- /* Receive response header */
235- ret = pSTSE -> io .BusRecvContinue (
236- pSTSE -> io .busID ,
237- pSTSE -> io .Devaddr ,
238- pSTSE -> io .BusSpeed ,
239- pFrame -> first_element -> pData ,
240- STSE_RSP_FRAME_HEADER_SIZE );
243+ /* ======================================================= */
244+ /* ========= Receive the frame in frame elements ========= */
245+
246+ ret = STSE_PLATFORM_BUS_ACK_ERROR ;
247+ while ((retry_count != 0 ) && (ret == STSE_PLATFORM_BUS_ACK_ERROR )) {
248+ /* - Receive frame length from target STSAFE */
249+ ret = pSTSE -> io .BusRecvStart (
250+ pSTSE -> io .busID ,
251+ pSTSE -> io .Devaddr ,
252+ pSTSE -> io .BusSpeed ,
253+ STSE_FRAME_LENGTH_SIZE + received_length + STSE_FRAME_CRC_SIZE );
254+
255+ if (ret != STSE_OK ) {
256+ retry_count -- ;
257+ stse_platform_Delay_ms (STSE_POLLING_RETRY_INTERVAL );
258+ }
259+ }
241260
242- if (ret != STSE_OK ) {
243- return ret ;
244- }
261+ /* - Verify correct reception*/
262+ if (ret != STSE_OK ) {
263+ return ret ;
264+ }
245265
246- /* Substract response header already read in STSAFE-A */
247- received_length -= STSE_RSP_FRAME_HEADER_SIZE ;
266+ /* Receive response header */
267+ ret = pSTSE -> io .BusRecvContinue (
268+ pSTSE -> io .busID ,
269+ pSTSE -> io .Devaddr ,
270+ pSTSE -> io .BusSpeed ,
271+ pFrame -> first_element -> pData ,
272+ STSE_RSP_FRAME_HEADER_SIZE );
248273
249- /* Receive and discard length (already stored) */
250- ret = pSTSE -> io .BusRecvContinue (
251- pSTSE -> io .busID ,
252- pSTSE -> io .Devaddr ,
253- pSTSE -> io .BusSpeed ,
254- NULL ,
255- STSE_FRAME_LENGTH_SIZE );
256- if (ret != STSE_OK ) {
257- return ret ;
258- }
274+ if (ret != STSE_OK ) {
275+ return ret ;
276+ }
259277
260- /* - Append CRC element to the RSP Frame (valid only in Receive Scope) */
261- stse_frame_element_allocate_push ( pFrame , eCRC , STSE_FRAME_CRC_SIZE , received_crc ) ;
278+ /* Substract response header already read in STSAFE-A */
279+ received_length -= STSE_RSP_FRAME_HEADER_SIZE ;
262280
263- /* If first element is longer than just the header */
264- if (pFrame -> first_element -> length > STSE_RSP_FRAME_HEADER_SIZE ) {
265- /* Receive missing bytes after discarding the 2 bytes length */
281+ /* Receive and discard length (already stored) */
266282 ret = pSTSE -> io .BusRecvContinue (
267283 pSTSE -> io .busID ,
268284 pSTSE -> io .Devaddr ,
269285 pSTSE -> io .BusSpeed ,
270- pFrame -> first_element -> pData + STSE_RSP_FRAME_HEADER_SIZE ,
271- pFrame -> first_element -> length - STSE_RSP_FRAME_HEADER_SIZE );
286+ NULL ,
287+ STSE_FRAME_LENGTH_SIZE );
272288 if (ret != STSE_OK ) {
273289 return ret ;
274290 }
275- }
276291
277- /* - Perform frame element reception and populate local RSP Frame */
278- pCurrent_element = pFrame -> first_element -> next ;
279- while (pCurrent_element != pFrame -> last_element ) {
280- if (received_length < pCurrent_element -> length ) {
281- pCurrent_element -> length = received_length ;
292+ /* - Append CRC element to the RSP Frame (valid only in Receive Scope) */
293+ stse_frame_element_allocate_push (pFrame , eCRC , STSE_FRAME_CRC_SIZE , received_crc );
294+
295+ /* If first element is longer than just the header */
296+ if (pFrame -> first_element -> length > STSE_RSP_FRAME_HEADER_SIZE ) {
297+ /* Receive missing bytes after discarding the 2 bytes length */
298+ ret = pSTSE -> io .BusRecvContinue (
299+ pSTSE -> io .busID ,
300+ pSTSE -> io .Devaddr ,
301+ pSTSE -> io .BusSpeed ,
302+ pFrame -> first_element -> pData + STSE_RSP_FRAME_HEADER_SIZE ,
303+ pFrame -> first_element -> length - STSE_RSP_FRAME_HEADER_SIZE );
304+ if (ret != STSE_OK ) {
305+ return ret ;
306+ }
282307 }
283- ret = pSTSE -> io .BusRecvContinue (
308+
309+ /* - Perform frame element reception and populate local RSP Frame */
310+ pCurrent_element = pFrame -> first_element -> next ;
311+ while (pCurrent_element != pFrame -> last_element ) {
312+ if (received_length < pCurrent_element -> length ) {
313+ pCurrent_element -> length = received_length ;
314+ }
315+ ret = pSTSE -> io .BusRecvContinue (
316+ pSTSE -> io .busID ,
317+ pSTSE -> io .Devaddr ,
318+ pSTSE -> io .BusSpeed ,
319+ pCurrent_element -> pData ,
320+ pCurrent_element -> length );
321+ if (ret != STSE_OK ) {
322+ return ret ;
323+ }
324+
325+ received_length -= pCurrent_element -> length ;
326+ pCurrent_element = pCurrent_element -> next ;
327+ }
328+
329+ ret = pSTSE -> io .BusRecvStop (
284330 pSTSE -> io .busID ,
285331 pSTSE -> io .Devaddr ,
286332 pSTSE -> io .BusSpeed ,
@@ -290,48 +336,36 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
290336 return ret ;
291337 }
292338
293- received_length -= pCurrent_element -> length ;
294- pCurrent_element = pCurrent_element -> next ;
295- }
296- ret = pSTSE -> io .BusRecvStop (
297- pSTSE -> io .busID ,
298- pSTSE -> io .Devaddr ,
299- pSTSE -> io .BusSpeed ,
300- pCurrent_element -> pData ,
301- pCurrent_element -> length );
302- if (ret != STSE_OK ) {
303- return ret ;
304- }
305-
306339#ifdef STSE_FRAME_DEBUG_LOG
307- printf ("\n\r STSAFE Frame < " );
308- stse_frame_debug_print (pFrame );
309- printf ("\n\r" );
340+ printf ("\n\r STSAFE Frame < " );
341+ stse_frame_debug_print (pFrame );
342+ printf ("\n\r" );
310343#endif /* STSE_FRAME_DEBUG_LOG */
311344
312- /* - Swap CRC */
313- stse_frame_element_swap_byte_order (& eCRC );
345+ /* - Swap CRC */
346+ stse_frame_element_swap_byte_order (& eCRC );
314347
315- /* - Pop CRC element from Frame*/
316- stse_frame_pop_element (pFrame );
348+ /* - Pop CRC element from Frame*/
349+ stse_frame_pop_element (pFrame );
317350
318- /* - Compute CRC */
319- ret = stse_frame_crc16_compute (pFrame , & computed_crc );
320- if (ret != STSE_OK ) {
321- return ret ;
322- }
351+ /* - Compute CRC */
352+ ret = stse_frame_crc16_compute (pFrame , & computed_crc );
353+ if (ret != STSE_OK ) {
354+ return ret ;
355+ }
323356
324- /* - Pop Filler element from Frame*/
325- if (filler_size > 0 ) {
326- stse_frame_pop_element (pFrame );
327- }
357+ /* - Pop Filler element from Frame*/
358+ if (filler_size > 0 ) {
359+ stse_frame_pop_element (pFrame );
360+ }
328361
329- /* - Verify CRC */
330- if (computed_crc != * (PLAT_UI16 * )received_crc ) {
331- return (STSE_SERVICE_FRAME_CRC_ERROR );
332- }
362+ /* - Verify CRC */
363+ if (computed_crc != * (PLAT_UI16 * )received_crc ) {
364+ return (STSE_SERVICE_FRAME_CRC_ERROR );
365+ }
333366
334- ret = (stse_ReturnCode_t )(pFrame -> first_element -> pData [0 ] & STSE_STSAFEA_RSP_STATUS_MASK );
367+ ret = (stse_ReturnCode_t )(pFrame -> first_element -> pData [0 ] & STSE_STSAFEA_RSP_STATUS_MASK );
368+ }
335369
336370 return ret ;
337371}
0 commit comments