A luta continua... e está para durar eheheh.
Uma breve noção de SPI: SPI é um método de comunicação síncrona que utiliza SDI, SDO, SCK e mais 1 ou 2 pinos que neste caso não interessa.
Configurado tudo isto, chego ao primeiro problema: o PAN3101 utiliza um pino para SDIO e outro para SCK, mas no meu MCU tenho 2 pinos a fazer o trabalho de 1 (SDI + SDO = SDIO).
Resolvi a questão da seguinte forma: liguei ambos os pinos, SDI + SDO, e como o pino de SDI está sempre configurado como input, posso trabalhar normalmente com o SDO. Quando quiser receber alguma coisa, coloco o SDO também como input, para que não force a comunicação a ir para Low ou para High.
Resolvido isto, tenho apenas um problema, quando estou a fazer a transmissão o registo SSPBUF fica cheio com o que acabei de transmitir e a flag SSPIF deixa de ter efeito, então faço o clear do registo primeiro.
Como se pode ver na página 4 do datasheet, se eu pedir a leitura do endereço 0x14 (enderesso para teste de comunicação), a resposta deveria ser 0x10, ou 16 em decimal, ou 10000 em binário.
Excerto do código:
PIR1bits.SSPIF=0;A[2]=16, então a comunicação está a ser bem feita.
SSPBUF=0x14;
while(!PIR1bits.SSPIF);
SSPBUF=0;
PIR1bits.SSPIF=0;
TRISB2=1; //tri-state
while(!PIR1bits.SSPIF); //espera resposta
A[2]=SSPBUF;
TRISB2=0; //output again
O problema até agora é quando peço a leitura do endereço 0x02 ou 0x03, que me deveria dar o deslocamento, o resultado ou é 0 (0b00000000), ou é -1 (0b11111111).
A investigação continua.....










