Test I2C non bloquant OK
This commit is contained in:
		
							parent
							
								
									5a570ac325
								
							
						
					
					
						commit
						ae0e476d70
					
				
							
								
								
									
										107
									
								
								Test.c
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								Test.c
									
									
									
									
									
								
							| @ -44,6 +44,7 @@ int test_trajectoire(void); | ||||
| int test_i2c_bus(void); | ||||
| void affiche_localisation(void); | ||||
| int test_i2c_lecture_pico_annex(); | ||||
| int test_i2c_lecture_pico_annex_nb(); | ||||
| 
 | ||||
| 
 | ||||
| // Mode test : renvoie 0 pour quitter le mode test
 | ||||
| @ -66,6 +67,7 @@ int mode_test(){ | ||||
|     printf("U - Scan du bus i2c\n"); | ||||
|     printf("V - APDS_9960\n"); | ||||
|     printf("W - Com i2c Pico Annexe\n"); | ||||
|     printf("X - Com i2c Pico Annexe - non bloquant\n"); | ||||
|     stdio_flush(); | ||||
|     int rep = getchar_timeout_us(TEST_TIMEOUT_US); | ||||
|     stdio_flush(); | ||||
| @ -149,6 +151,11 @@ int mode_test(){ | ||||
|         while(test_i2c_lecture_pico_annex()); | ||||
|         break; | ||||
| 
 | ||||
|     case 'X': | ||||
|     case 'x': | ||||
|         while(test_i2c_lecture_pico_annex_nb()); | ||||
|         break; | ||||
| 
 | ||||
|     case PICO_ERROR_TIMEOUT: | ||||
|         iteration--;         | ||||
|         if(iteration == 0){ | ||||
| @ -164,6 +171,22 @@ int mode_test(){ | ||||
|      | ||||
| } | ||||
| 
 | ||||
| int test_continue_test(){ | ||||
|     int lettre; | ||||
|     printf("q pour quitter, une autre touche pour un nouveau test.\n"); | ||||
|     do{ | ||||
|         lettre = getchar_timeout_us(0); | ||||
|     }while(lettre == PICO_ERROR_TIMEOUT || lettre == 0); | ||||
|     switch(lettre){ | ||||
|         case 'q': | ||||
|         case 'Q': | ||||
|             return 0; | ||||
|         default: | ||||
|             return 1; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| bool reserved_addr(uint8_t addr) { | ||||
|     return (addr & 0x78) == 0 || (addr & 0x78) == 0x78; | ||||
| } | ||||
| @ -214,7 +237,89 @@ int test_i2c_lecture_pico_annex(){ | ||||
|         } | ||||
|         printf("\n"); | ||||
|     } | ||||
|     return 0; | ||||
|     return test_continue_test(); | ||||
| } | ||||
| 
 | ||||
| int test_i2c_lecture_pico_annex_nb(){ | ||||
|     i2c_maitre_init(); | ||||
|     uint8_t tampon[10]; | ||||
|     uint8_t registre=0; | ||||
|     uint8_t adresse = 0x17; | ||||
|     uint32_t time_i2c[5]; | ||||
|     const uint8_t T_MAX_I2C = 10; | ||||
|     int ret;  | ||||
| 
 | ||||
|     time_i2c[0] = time_us_32(); | ||||
| 
 | ||||
|     // On charge l'adresse de l'escalve
 | ||||
|     i2c0->hw->enable = 0; | ||||
|     i2c0->hw->tar = adresse; | ||||
|     i2c0->hw->enable = 1; | ||||
| 
 | ||||
|     // On envoie l'adresse du registre à lire
 | ||||
|     // Pas de stop, pas de restart, écriture : 0, 
 | ||||
| 
 | ||||
|     i2c0->hw->data_cmd = registre; | ||||
| 
 | ||||
|     uint8_t first = false; | ||||
|     uint8_t last = false; | ||||
| 
 | ||||
|     for(int i=0; i<T_MAX_I2C; i++){ | ||||
|         first = false; | ||||
|         last = false; | ||||
|         if (i == 0){ | ||||
|             first = true; | ||||
|         } | ||||
|         if(i == T_MAX_I2C -1){ | ||||
|             last = true; | ||||
|         } | ||||
| 
 | ||||
|         i2c0->hw->data_cmd = | ||||
|                 bool_to_bit(first) << I2C_IC_DATA_CMD_RESTART_LSB | | ||||
|                 bool_to_bit(last) << I2C_IC_DATA_CMD_STOP_LSB | | ||||
|                 I2C_IC_DATA_CMD_CMD_BITS; // -> 1 for read
 | ||||
|     } | ||||
| 
 | ||||
|     time_i2c[1] = time_us_32() - time_i2c[0] ; | ||||
| 
 | ||||
|     // On attend la fin de la transaction i2c
 | ||||
|     while(i2c0->hw->status & I2C_IC_STATUS_MST_ACTIVITY_BITS); | ||||
| 
 | ||||
|     time_i2c[2] = time_us_32() - time_i2c[0] ; | ||||
| 
 | ||||
|     // On lit le tampon I2C
 | ||||
|     // uint8_t * dst;
 | ||||
|     // dst = tampon;
 | ||||
|      | ||||
|     for(int i=0; i<T_MAX_I2C; i++){ | ||||
|         // On attend une donnée
 | ||||
|         while(!i2c_get_read_available(i2c0)); | ||||
| 
 | ||||
|         // Code erreur
 | ||||
|         if(i2c0->hw->tx_abrt_source){ | ||||
|             printf("Erreur I2C: Abort : %4x\n", i2c0->hw->tx_abrt_source); | ||||
|         } | ||||
| 
 | ||||
|         //On lit la donnée
 | ||||
|         tampon[i] = (uint8_t) i2c0->hw->data_cmd; | ||||
|     } | ||||
| 
 | ||||
|     time_i2c[3] = time_us_32() - time_i2c[0] ; | ||||
| 
 | ||||
|     // Affichage
 | ||||
|     for(int i=0; i<T_MAX_I2C; i++){ | ||||
|         printf("%c", tampon[i]); | ||||
|     } | ||||
|     printf("\n"); | ||||
| 
 | ||||
|     for(int i=0; i<T_MAX_I2C; i++){ | ||||
|         printf("%2x ", tampon[i]); | ||||
|     } | ||||
|     printf("\n"); | ||||
| 
 | ||||
|     printf("T_init: %u, T_attente: %u, T_lecture: %u\n", time_i2c[1], time_i2c[2], time_i2c[3]); | ||||
| 
 | ||||
|     return test_continue_test(); | ||||
| } | ||||
| 
 | ||||
| int test_i2c_bus(){ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user