C USARTD0 als SPI?

Sind der RESET- und der WP-Pin des AT45DB161E zuverlässig auf High?

Gibt es auf dem Board irgendeine Firmware, die den Chip in den (Deep)-Power-Down-Mode versetzt?
Dann muß er nämlich erst aufgeweckt werden...
 
Da ist keine Firmware drauf (außer die ganz am Anfang) die das machen könnte. Die Hardware sollte inordnung sein. Ob der Chip funktioniert kann ich leider nicht sagen...
 
Die Boards, die ich von Atmel kenne, haben alle zwei Controller. Der eine hat eine Firmware für USB, Programmierung des Target-Controllers etc.
Der könnte aus Energiespargründen den Flash in den Power-Down-Mode versetzen.
Auf dem Schaltplanschnipsel, den Du ganz zu Anfang gepostet hast, sieht man, daß die Leitungen vom Flash nicht nur an den Target-Controller gehen. Leider ist nicht mehr zu erkennen und ich habe jetzt auch keine Lust nach dem Schaltplan zu suchen...
 
Dann kennst du um weiten nicht alle. Auf diesem Board ist nur die eine CPU drauf. Diese hat eine eigene USB Schnittstelle. Sprich das USB Modul ist in diesem einen Controller mit eingegossen.
 
Auf dem Schaltplanschnipsel, den Du ganz zu Anfang gepostet hast, sieht man, daß die Leitungen vom Flash nicht nur an den Target-Controller gehen. Leider ist nicht mehr zu erkennen und ich habe jetzt auch keine Lust nach dem Schaltplan zu suchen...
Hier der Schaltplan ...
www.atmel.com/dyn/resources/prod_documents/AVR1923.zip

Am SPI (USARTD0) ist ggf. noch ein Display angeschlossen, allerdings nur mit MOSI und SCK und CS ist natürlich unterschiedlich.
Also kein Problem.
 
Dann kennst du um weiten nicht alle.
Habe ich auch nicht behauptet. ;) Ich habe allerdings schon mehrere SPI-Flash und -EEPROMs ohne irgendwelche Problem an XMEGAs angeschlossen. (Ohne Eval-Board)
Hier der Schaltplan ...
Danach ist der Chip korrekt angeschlossen und kann auch nicht im Power-Down sein, was zu beweisen war...
Folglich befindet sich der Fehler im Programm...
 
Dann zeig doch mal bitte deine Initialisierung des Usarts im SPI Mode..
 
Sysclk: 12 Mhz
Flash MX25R6435F an USARTC1


CodeBox C
PORTC.OUTSET = FLASHCS_bm | FLASHMOSI_bm;
PORTC.DIRSET = FLASHCS_bm | FLASHSCK_bm | FLASHMOSI_bm;
PR.PRPC &= ~PR_USART1_bm;                              // enable Flash USART
USARTC1.CTRLC = USART_CMODE_MSPI_gc | USART_UCPHA_bm;  // = UCPHA }
PORTC.PIN5CTRL = PORT_INVEN_bm;                        // = UCPOL } Mode 3
USARTC1.BAUDCTRLA = 0;                                 // Baudrate 6 MB
USARTC1.CTRLB = USART_TXEN_bm | USART_RXEN_bm;

Für Mode 0 müssen UCPHA und UCPOL auf 0.

Inzwischen benutze ich für Flash & EEPROM lieber den SPI, weil einfacher zu bedienen, als USART in SPI-Mastermode.
 
@Mikro23 Du kommst aus Großraum Hannover?
 
Sehr komisch..
Habe deine Init. mal genommen und an meine Belegung angepasst.. Es zappelt wieder alles bis auf MISO.. Arrgh


CodeBox C
void dataflash_init (void)
{
   PORTF.OUTSET   = (1<<SPI_SS_bp);
   PORTD.OUTSET   = (1<<SPI_MOSI_bp);
   PORTF.DIRSET = (1<<SPI_SS_bp);
   PORTD.DIRSET = (1<<SPI_SCK_bp) | (1<<SPI_MOSI_bp);
   PR.PRPC &= ~PR_USART0_bm;                              // enable Flash USART
   USARTD0.CTRLC = USART_CMODE_MSPI_gc | (1<<USARTD0_UCPHA_bp);  // = UCPHA }
   PORTD.PIN1CTRL = PORT_INVEN_bm;                        // = UCPOL } Mode 3
   USARTD0.BAUDCTRLA = 30;                                 // Baudrate 6 MB
   USARTD0.CTRLB = USART_TXEN_bm | USART_RXEN_bm;
} 


Ich kann nicht glauben das der Flash ne Macke hat.
 
Es zappelt wieder alles bis auf MISO.. Arrgh
Poste bitte einmal deinen kompletten Code ...

(1) Definition der Signale
(2) Initialisierung
(3) SPI RW Funktion
(3) Registerinhalt lesen oder was du da probierst

Eventuell einfach mal das komplette Projekt anhängen.
 
Hier ist der Code den ich zum Testen nutze..



CodeBox C
/*
 * xmega256a3bu_flash.c
 *
 * Created: 08.06.2017 07:16:49
 * Author : Hm
 */

#ifndef F_CPU
   #define F_CPU   2e6
#endif

#include <avr/io.h>
#include <stdio.h>
#include "spi.h"
#include "flash-at45db.h"

spi_usart_t   *FlashSPI;

#define USART_SPI       USARTD0
#define USART_PORT       PORTD
#define USART_SS_PORT   PORTF
#define USART_MOSI_bm   (1<<3)
#define USART_SCK_bm   (1<<1)
#define USART_MISO_bm   (1<<2)
#define USART_SS_bm       (1<<4) // PORTF

void dataflash_init (void)
{
   USART_SS_PORT.OUTSET   = (USART_SS_bm);
   USART_PORT.OUTSET       = (USART_MOSI_bm);

   USART_SS_PORT.DIRSET   = (USART_SS_bm);
   USART_PORT.DIRSET       = (USART_SCK_bm) | (USART_MOSI_bm);

   PR.PRPC &= ~PR_USART0_bm;                              // enable Flash USART

   USART_SPI.CTRLC = USART_CMODE_MSPI_gc | (1<<USARTD0_UCPHA_bp);  // = UCPHA }
   
   PORTD.PIN1CTRL = PORT_INVEN_bm;                        // = UCPOL } Mode 3

   USART_SPI.BAUDCTRLA = 03;                                 // Baudrate 6 MB

   USART_SPI.CTRLB = USART_TXEN_bm | USART_RXEN_bm;
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               


uint8_t DF_SPI_RW(uint8_t data_out)
{
   while((USARTD0.STATUS & USART_DREIF_bm) == 0);  // Warte bis DREIF=1 ist (=Transmit Buffer empty)
   USARTD0.DATA = data_out;                        // Daten senden
   
   while ((USARTD0.STATUS & USART_RXCIF_bm) == 0); // Warte bis RXCIF=1 ist (=Data in Receive Buffer)
   return USARTD0.DATA;
}

uint16_t Read_DF_status (void)
{
   uint16_t result;
   
   USART_SS_PORT.OUTCLR = USART_SS_bm;
   
   DF_SPI_RW(0xD7);
   result = DF_SPI_RW(0x00);
   result |= (DF_SPI_RW(0x00)<<8);
   
   USART_SS_PORT.OUTSET = USART_SS_bm;
   
   return result;
}

int main(void)
{
   PORTR.DIR = 1<<0; // state_led
   PORTR.OUTCLR=1<<0; // state_led_on

   dataflash_init();
   
    while (1)
    {
       if(Read_DF_status() == (1<<7))
       {
       }
    }
}
 
Mir fällt leider nichts auf.

Auf dem Board ist an J4 nichts angeschlossen? Die SPI Signale vom USARTD0 liegen da auch an.

Du nutzt SPI Mode 3. Ich würde da sicherheitshalber immer auch die Signale zuvor richtig initialisieren.
SCK ist high bei CS high->low.

Teste auch noch einmal mit SPI Mode 0.

Sonst habe ich keine Ideen mehr.
 
@Mikro23 Du kommst aus Großraum Hannover?
Gut erkannt ;) Bin auch fast jede Woche für ein paar Stunden in Neustadt.

Im Hardware User Guide http://www.atmel.com/Images/doc8394.pdf
Table 4-5 steht, daß MOSI ans Flash geht
und MISO ans Flash und ans Display.
Wenn das so wäre, könnte das den MISO stören.
Im Schaltplan ist es allerdings andersrum, was richtig wäre.

Hast Du an J4 irgendwas angeschlossen, was MISO stören könnte?
 
Nein. Habe an dem Board nichts weiter angeschlossen. Alles so wie ich es bekommen habe.

Was treibt dich denn nach neustadt?
 
Ist näher als Hannover ;) Freunde wohnen da, ebenso einer meiner Auftraggeber und man kann auch gut einkaufen...

Das Programm sieht soweit ganz gut aus. Wie Dirk schon erwähnte, könntest Du bei Mode 3 nochmal probieren beim Initialisieren den Clock-Pin auf eins zu setzten oder gleich Mode 0 verwenden. Der Flash sollte ja beides können.
 
Okay. Werde ich später mal versuchen.
 
Nach wie vor keine Antwort..


CodeBox C
void dataflash_init (void)
{
   USART_SS_PORT.OUTSET   = (USART_SS_bm);
   USART_PORT.OUTSET       = (USART_MOSI_bm);
   USART_PORT.OUTSET       = (USART_SCK_bm);

   USART_SS_PORT.DIRSET   = (USART_SS_bm);
   USART_PORT.DIRSET       = (USART_SCK_bm) | (USART_MOSI_bm);

   PR.PRPC &= ~PR_USART0_bm;                       

   USART_SPI.CTRLC = USART_CMODE_MSPI_gc | (1<<USARTD0_UCPHA_bp);  
   
   PORTD.PIN1CTRL = PORT_INVEN_bm;                       

   USART_SPI.BAUDCTRLA = 03;                                 

   USART_SPI.CTRLB = USART_TXEN_bm | USART_RXEN_bm;
}   
 
Ich habe eine SoftwareSPI Funktion an deine Anwendung angepasst,
die könntest du einmal austesten.

Entspricht SPI Mode 3

void SPI_Init(void)
uint8_t SPI_RW (uint8_t output)
uint16_t Read_DF_status (void)

Am "DISPLAY_" nicht stören, kommt aus einem Display Projekt von mir.
Ich wollte nicht zuviel ändern, wegen Schreibfehler ;)



CodeBox C
#define DISPLAY_CONTROL_PORT PORTF
#define DISPLAY_SIGNAL_CS 4 // PF4

#define DISPLAY_SPI_PORT PORTD
#define DISPLAY_SPI_MOSI 3 // PD3
#define DISPLAY_SPI_MISO 2 // PD2
#define DISPLAY_SPI_SCK 1  // PD1


#define CS_LOW DISPLAY_CONTROL_PORT.OUTCLR = 1<<DISPLAY_SIGNAL_CS;
#define CS_HIGH DISPLAY_CONTROL_PORT.OUTSET = 1<<DISPLAY_SIGNAL_CS;

void SPI_Init(void)
{

   DISPLAY_CONTROL_PORT.OUTSET = 1<<DISPLAY_SIGNAL_CS;
   DISPLAY_CONTROL_PORT.DIRSET = 1<<DISPLAY_SIGNAL_CS;        // CS: Output, high

   DISPLAY_SPI_PORT.OUTSET = (1<<DISPLAY_SPI_MOSI) | (1<<DISPLAY_SPI_SCK);  // MOSI, SCK: Output, high
   DISPLAY_SPI_PORT.DIRSET = (1<<DISPLAY_SPI_MOSI) | (1<<DISPLAY_SPI_SCK);
  
   DISPLAY_SPI_PORT.DIRCLR = 1<<DISPLAY_SPI_MISO;   // MISO: Input, high impedance state
   DISPLAY_SPI_PORT.OUTCLR = 1<<DISPLAY_SPI_MISO;

}



uint8_t SPI_RW (uint8_t output)
{
   uint8_t input=0;
   uint8_t i;
  
   for (i=0; i<8; i++)
   {
       DISPLAY_SPI_PORT.OUTCLR = 1<<DISPLAY_SPI_SCK;    // SCK low

       if (output & 0x80)
       DISPLAY_SPI_PORT.OUTSET = 1<<DISPLAY_SPI_MOSI; // MOSI high
       else
       DISPLAY_SPI_PORT.OUTCLR = 1<<DISPLAY_SPI_MOSI; // MOSI low

       DISPLAY_SPI_PORT.OUTSET = 1<<DISPLAY_SPI_SCK;    // SCK high

       input <<= 1;          // Input MISO

       if (DISPLAY_SPI_PORT.IN & (1<<DISPLAY_SPI_MISO))
       input |= 1;
       else
       input &= ~1;

       output <<= 1;

   }
  
   return input;
}

uint16_t Read_DF_status (void)
{
   uint16_t result;
  
   CS_LOW
  
   SPI_RW(0xD7);
   result = SPI_RW(0x00);
   result |= (SPI_RW(0x00)<<8);
  
   CS_HIGH
  
   return result;
}


 
Wenn Du Atmel Studio benutzt:

File -> New -> ExampleProject
nach
AT45DBX DataFlashExample1 - XMEGA A3BU Explained
suchen.

Das ist ein Beispielprogramm für Dein Board, um den Flash-Chip zu benutzen.
Damit könntest Du zumindest feststellen, ob er in Ordnung ist.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)