Gestion des PIO C et D ATSAM3X8E

Bonjour,
Je n'arrive pas à récupérer l'état d'une entrée sur le port C et D mais j'y arrive sur le port A et B. Donc quel est le meilleur code pour paramétrer les I/O en entrée et lire ces entrées. Et seulement le faire par les registres pour être le plus près du matériel. Le matériel est le ATSAM3X8E.
Actuellement, mon code ressemble à ça :

void pinMode(Pio *PORT, int PIN, int MODE) 
{ 
PORT->PIO_PER = PIN;//PORT->PIO_PER | PIN; 
if(MODE == 0)//OUTPUT 
{ 
PORT->PIO_CODR = PIN; //Pin state 0 
PORT->PIO_OER = PIN; //Set to OUTPUT 
PORT->PIO_OWER = PIN; //Enable PIO 
PORT->PIO_PUDR = PIN; //Disable pull up 
} 
if(MODE == 1)//INPUT PULLUP 
{ 
//Clock 
PMC->PMC_PCR = PIN | PMC_PCR_EN | PMC_PCR_CMD; 
PMC->PMC_PCER0 = (int) PORT; 
//Set INPUT 
PORT->PIO_ODR = PIN; 
PORT->PIO_OWER = PIN; 
//PULLUP 
PORT->PIO_PUER = PIN; 
} 
if(MODE == 2)//INPUT 
{ 
//Clock 
PMC->PMC_PCR = PIN | PMC_PCR_EN | PMC_PCR_CMD; 
PMC->PMC_PCER0 = (int) PORT; 
//Set INPUT 
PORT->PIO_ODR = PIN; 
PORT->PIO_OWER = PIN; 
//Disable PULLUP 
PORT->PIO_PUDR = PIN; 
} 
} 
int pinRead(Pio *PORT, int PIN){ 
uint32_t pin_val = PORT->PIO_PDSR & PIN; 
if ((pin_val) == 0) { 
pin_val = 0; 
}else{ 
pin_val = 1; 
} 
return pin_val; 
} 
void pinWrite(Pio *PORT, int PIN, int VALUE){ 
if (VALUE == 1){ 
PORT->PIO_SODR = PIN; 
}else if (VALUE ==0 ){ 
PORT->PIO_CODR = PIN; 
} 
} 

Et je définis les pin par le codes suivant :

typedef struct 
{ 
volatile int PIN; 
Pio *PORT; 
}STR_PIN; 
typedef enum 
{ 
OUTPUT, 
INPUT_P, 
INPUT, 
}ENUM_MODE; 

typedef enum 
{ 
LOW, 
HIGH, 
}ENUM_STATE; 
volatile STR_PIN Led; 
volatile STR_PIN Pin; 
void init(void){ 

Led.PORT = PIOB; 
Led.PIN = PIO_PB27; 
Pin.PORT = PIOC; 
Pin.PIN = PIO_PC4; 

pinMode(Led.PORT, Led.PIN, OUTPUT); 
pinMode(Pin.PORT, Pin.PIN, INPUT); 
} 

Merci d'avance pour votre aide.

hello
une section réservée aux "due"

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.