Boa noite pessoal, depois de passar dois dias pesquisando e não encontrando muito material sobre o assunto, principalmente em português, vou disponibilizar uma rotina de leitura e escrita via SPI para arduino DUE. Existem diversos tutoriais na internet mas somente para os outros modelos de arduino, pois o DUE utiliza a biblioteca SPI de uma forma diferente.
Esse código eu peguei do blog do Kerry D. Wong e adaptei para trabalhar com o DUE + FRAM FM25l16.
Uma das primeiras coisa a se prestar atenção são nos pinos SPI do ARDUINO DUE, eles ficam no conector SPI o mesmo que é ligado o shield de ethernet+sdcard.
Ali estão os pinos de MOSI, SCK e MISO, o pino CS pode ser o 4, 10 ou 52.
Depois de escolher o pino CS você deve inicializar a rotina SPI.begin([pino]), e todo envio de comando deve chamar o pino, exemplo SPI.transfer(pino,comando).
Outro detalhe é que nos outros arduinos quando executa a rotina de envio SPI.transfer, sempre se coloca o pino CS em LOW, com o arduino DUE a própria biblioteca faz, sendo assim é só chamar o comando.
mas tem um detalhe, quando queremos enviar mais de um pacote de informação deve-se chamar com SPI.transfer(pino,comando,SPI_CONTINUE);
desta forma o pino CS continua em LOW para o envio do próximo pacote.
Vou deixar o programa exemplo, qualquer dúvida é só pergunta.
[code]
#include <SPI.h>
// Comandos Retirados do manual do fabricante
const byte CMD_WREN = 0x06; //0000 0110 Set Write Enable Latch
const byte CMD_WRDI = 0x04; //0000 0100 Write Disable
const byte CMD_RDSR = 0x05; //0000 0101 Read Status Register
const byte CMD_WRSR = 0x01; //0000 0001 Write Status Register
const byte CMD_READ = 0x03; //0000 0011 Read Memory Data
const byte CMD_WRITE = 0x02; //0000 0010 Write Memory Data
const int FRAM_CS1 = 52; // chip select
byte FRAMStatusRegistrador(){
SPI.transfer(FRAM_CS1, CMD_RDSR,SPI_CONTINUE);
byte streg = SPI.transfer(FRAM_CS1,0x00);
Serial.print("STATUS DO CMD_RDSR: ");
Serial.println(streg);
}
int FRAMAlteraRegistrador(byte VALOR){
SPI.transfer(FRAM_CS1,CMD_WREN);
SPI.transfer(FRAM_CS1, CMD_WRSR,SPI_CONTINUE);
SPI.transfer(FRAM_CS1,VALOR);
}
int FRAMWrite(int addr, byte DADO)
{
if (addr > 0x7ff) return -1;
byte addrMSB = (addr >> & 0xff;
byte addrLSB = addr & 0xff;
SPI.transfer(FRAM_CS1,CMD_WREN);
SPI.transfer(FRAM_CS1,CMD_WRITE,SPI_CONTINUE);
SPI.transfer(FRAM_CS1,addrMSB,SPI_CONTINUE);
SPI.transfer(FRAM_CS1,addrLSB,SPI_CONTINUE);
SPI.transfer(FRAM_CS1,DADO);
return 0;
}
byte FRAMRead(int addr)
{
int cs = 0;
cs = FRAM_CS1;
if (addr > 0x7ff) return -1;
//Serial.println("VAI LER");
byte addrMSB = (addr >> & 0xff;
byte addrLSB = addr & 0xff;
//digitalWrite(cs, LOW);
SPI.transfer(FRAM_CS1,CMD_READ,SPI_CONTINUE);
SPI.transfer(FRAM_CS1,addrMSB,SPI_CONTINUE);
SPI.transfer(FRAM_CS1,addrLSB,SPI_CONTINUE);
return SPI.transfer(FRAM_CS1,0xFF);
}
void setup()
{
Serial.begin(9600);
pinMode(FRAM_CS1, OUTPUT);
SPI.begin(FRAM_CS1); //SEMPRE REFERENCIA O PINO CS
SPI.setDataMode(FRAM_CS1,SPI_MODE0);
SPI.setBitOrder(FRAM_CS1,MSBFIRST);
SPI.setClockDivider(FRAM_CS1,21); // Detalhe importante o divisor de clock é numero e não a constante como nos demais arduinos
FRAMStatusRegistrador();
FRAMAlteraRegistrador(0x00);
FRAMStatusRegistrador();
char buf[]="192.168.013.333";
delay(500);
FRAMWrite(0x0600, 0x00);
FRAMWrite(0x0601, 0x01);
FRAMWrite(0x0602, 0x2A);
FRAMWrite(0x0603, 0x02); //MAC
FRAMWrite(0x0604, 0x5F);
FRAMWrite(0x0605, 0x3A);
*/
Serial.println("[ LEITOR FRAM FM25L16 ]");
Serial.print("END IP: ");
for (int i = 0X000; i < 0X00F; i++){
//FRAMRead(i, (byte*) buf, 14);
buf = FRAMRead(i);
Serial.print(buf);
}
Serial.println("");
Serial.println("[ DADOS LIDOS DE (0X00 ATE 0X7FF) ]");
for (int i = 0; i < 0x7FF; i++){
//FRAMRead(i, (byte*) buf, 14);
buf = FRAMRead(i);
Serial.print(buf);
}
}
void loop()
{
}
[/code]