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.