Pages: [1]   Go Down
Author Topic: Dataflash AT45DB161D and Arduino Leonardo  (Read 1194 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 1
Posts: 37
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Okay so i've been trying to get the at45db161d with the leonardo for the past couple of hours using the library available in the playground and haven't had much luck with it.
After looking online i realised that the SPI headders are no longer populated with the DIO headers instead they are on the ICSP header I modified the library to use those pins instead pointing them to:
MISO -  Digital 14   
SCK -   Digital 15   
MOSI - Digital 16

Since SS pin is not brought out on the leonardo I initially tried using just a regular DIO pin in my case D11, which didn't work. Next reading online I found out that the SS pin can be tapped into using the via just on top of RX Led and pointing the code to use D17; that hasn't worked either.

I've tested the flash using an Arduino Mega (Mega1280) and using its SPI headers and the flash is working without any issues with the Leonardo it hasn't worked. Any Ideas?
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 37
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Okay so i finally got the AT45DB161D to work with the leonardo. I used another library i found online http://blockos.github.com/arduino-dataflash/ maybe this can be helpful for someone else. The pageTest example in the library should work with little work, but i found it to be more geared towards uno and duemilanove. Below is a little sketch i wrote to test the Lenonardo. you can also download it from here http://code.google.com/p/osyrisos/downloads/list

Code:
// DATAFLASH LEONARDO TEST.
//
// Pin Connections Dataflash to Arduino Leonardo
//
//  DataFlash  Arduino Leonardo
//    pin 1  ---   pin 16
//    pin 2  ---   pin 15
//    pin 3  ---   pin  8
//    pin 4  ---   pin 10
//    pin 5  ---   pin  7
//    pin 6  ---   3.3V
//    pin 7  ---   GND
//    pin 8  ---   pin 14
//
// AT45DB161B Pin Layout
//         ___
//  SI  1 | u | 8 SO
//  SCK 2 |   | 7 GND
//  RST 3 |   | 6 VCC
//  CS  4 |___| 5 WP
//
// Arduino Leonardo ICSP Pin Layout
//
//              _____
//  D14 MISO 1 |__|__| 2 VDD
//  D15 SCK  3 |__|__| 4 MOSI D16
//      RST  5 |__|__| 6 GND
//
// This sketch is using blockos arduino-dataflash library available here:
// http://blockos.github.com/arduino-dataflash/
// and uses the arduino-timerone Library avaiable here:
// http://code.google.com/p/arduino-timerone/downloads/list
// Example by Taha Bintahir, http://mtaha.wordpress.com
//************************************************************************************


#include <DataFlash.h>
#include <TimerOne.h>
#include <SPI.h>

#define ledPin 13 // LED @ pin 13
#define baudRate 115200 // Baudrate for serial communication
#define timerIntterupt 1000 // Microsecond tick
#define lF 10 // ASCII Linefeed
#define msgLength 512 // Message Length

DataFlash dF; // DataFlash library object

unsigned long tickCounter = 0; // Tick counter used for subtimers
byte mode = 0; // 0 - default waiting mode, 1 - store mode, 2 - read mode

void setup(){
  uint8_t dFStatus;
  DataFlash::ID id;
 
  pinMode(ledPin, OUTPUT); // Initialise Led Pin
  digitalWrite(ledPin, LOW); // Ensure Led is turned OFF
 
  Serial.begin(baudRate); // Initialise Serial Communication @ 115200 bps
  SPI.begin(); // Initialise SPI
 
  Timer1.initialize(timerIntterupt); // Initialise Timer1 @ 1ms tick
  Timer1.attachInterrupt(timerIsr); // Initialise Timer1 Interrupt Subroutine function
 
  //delay(25000); // 25sec delay, allow us to press the serial monitor button and to compensate for the Leonardo to be detected by the PC
  while(!Serial){
    // Wait for serial port to connect. Needed for Leonardo only
  }
 
  dF.setup(10, 8, 7); // Initialise DataFlash SS - pin 10, RST - pin 8, WP - pin 7
 
  delay(10); // Settling time
 
  dFStatus = dF.status(); // Read status register
 
  dF.readID(id);
 
  // Display status register
  Serial.print("Status register :");
  Serial.print(dFStatus, BIN);
  Serial.print('\n');

  // Display manufacturer and device ID
  Serial.print("Manufacturer ID :\n");  // Should be 00011111
  Serial.print(id.manufacturer, HEX);
  Serial.print('\n');

  Serial.print("Device ID (part 1) :\n"); // Should be 100110
  Serial.print(id.device[0], HEX);
  Serial.print('\n');

  Serial.print("Device ID (part 2)  :\n"); // Should be 00000000
  Serial.print(id.device[1], HEX);
  Serial.print('\n');

  Serial.print("Extended Device Information String Length  :\n"); // 00000000
  Serial.print(id.extendedInfoLength, HEX);
  Serial.print('\n');
 
  Serial.println();
  Serial.println("Press 'S' to store data or press 'R' to read data"); 
   
}
void loop(){
  // Read Serial buffer only when there is data present
  if(Serial.available() > 0){
    uint16_t inByte = 0;
   
    inByte = Serial.read(); // Read Serial Buffer
    if(inByte != 0){
      // If 'S' byte is read
      if(inByte == 'S'){
        mode = 1; // Set state machine to mode 1
        Serial.println("What page do you want to store your data on?");
        while(1){
          // Store Data;
          if(Serial.available()){
            inByte = Serial.read();
            // If '`' is recieved exit out to main menu
            if(inByte == '`'){
              inByte = 0;
              mode = 0;
              mainMenu();
              break;
            }
            // Store data in page specified by user
            storeData(inByte);
            mainMenu();
            break;
          }
        }       
      }
      // if 'R' byte is read
      else if(inByte == 'R'){
        mode = 2; // Set state machine to mode 2
        Serial.println("What page do you want to read data from?");
        while(1){
          // Read Data
          if(Serial.available()){
            inByte = Serial.read();
            // If '`' is recieved exit out to main menu
            if(inByte == '`'){
              inByte = 0;
              mode = 0;
              mainMenu();
              break;
            }
            // Read data from user specified page
            readData(inByte);
            mainMenu();
            break;
          }
        }       
      }
    }
  }
}

// Timer1 Interrupt Subroutine Function triggered every 1ms
void timerIsr(){
  tickCounter++; // Count number of ticks
 
  // SubTimer1 @ 250ms
  if(tickCounter % 100 == 0){
    //Serial.println(mode);
    if(mode == 1){
      digitalWrite( ledPin, digitalRead(ledPin)^1 ); //  Blink LED every 250ms in Store mode
    }   
  }
 
  // SubTimer1 @ 500ms
  if(tickCounter % 500 == 0){
    //Serial.println(mode);
    if(mode == 2){
      digitalWrite( ledPin, digitalRead(ledPin)^1 ); // Blink LED every 500ms in Read mode
    }
  }
}

void mainMenu(){
  mode = 0; // Set state machine to default - 0
 
  // Check if led is turned ON if it is turn it OFF
  if(digitalRead(ledPin) == HIGH){
    digitalWrite(ledPin, LOW);
  }
 
  Serial.println();
  Serial.println("Press 'S' to store data or press 'R' to read data"); // Print main menu again
}

void storeData(uint16_t nPage){
  char msg[msgLength]; // Serial Read message buffer
  byte dataLength = 0; // Number of bytes recieved in the message
 
  Serial.println("Enter Data String: ");
  while(1){
    if(Serial.available()){
      dataLength = Serial.readBytesUntil('\n', msg, msgLength);
      break;     
    }   
  }
  msg[dataLength] = '\0'; // Terminate end of message with '\0' to easily find EOF
 
  dF.bufferWrite(1,0); // Select dataflash buffer 1 @ 0 offset
 
  // Transfer message to DataFlash Buffer
  for(int i = 0; msg[i] != '\0'; i++){
    SPI.transfer(msg[i]);
  }
 
  SPI.transfer('\0'); // Add '/0' to locate EOF within the DataFlash
 
  dF.bufferToPage(1, nPage); // Write DataFlash Buffer 1 to Pag
}

void readData(uint16_t nPage){
  uint8_t data; // Byte storage of data as recieved
 
  Serial.print('Page being read: ');
  Serial.println(nPage);
 
  dF.pageRead(nPage, 0); // Read user specified page from offset 0
 
  // Send FF to retrieve bytes from DataFlash
  do{
    data = SPI.transfer(0xff);
    if(data != '\0'){
      Serial.print(data);
    }
  }while(data != '\0');
 Serial.println();
}
Logged

Pages: [1]   Go Up
Jump to: