He conectado un IC de memoria flash SST26VF064B de 8Mb a un ATMeag1284 como se muestra en el siguiente diagrama. Mi plan es hablar con SPI.
Tengaencuentaquetodosloscondensadoresenelesquemason100nF.
AlleerelIDdeJEDECnoobtengolosvaloresesperados.PrimeroestablezcolalíneaSSenbaja,luegoenvíoelcomando0x9F
,luegoleo3bytes(enviando0xff
datosficticios)y,finalmente,lalíneaSSvuelveasubir.La0xBF 0x26 0x43
para el dispositivo específico Tengo (ver página 24). Sospecho que algo está mal con mi conexión SPI. Sin embargo, la lectura del osciloscopio de las líneas SCK, MOSI y SS se ve como se esperaba. También mi código decodifica correctamente el patrón en la línea MISO como 0x7c 0x20 0x6f
. Puede encontrar las lecturas del osciloscopio a continuación.
Además, intenté leer el estado y la configuración con los comandos 0x05
respectivamente 0x35
. Sin embargo, ambos devuelven solo 0x00
. Según la hoja de datos, al menos el registro de configuración debe contener un 1 en la configuración de fábrica en el 3er bit.
El siguiente código se ejecuta en ATMega1284:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void setSSLow() {
// Drive SS to low
PORTB &= ~(1<<PINB4);
}
void setSSHigh() {
// Set SS to high
PORTB |= (1<<PINB4);
}
void SPI_MasterInit(void)
{
// Set SS, MOSI and SCK output, all others input
DDRB = (1<<PINB4)|(1<<PINB5)|(1<<PINB7);
setSSHigh();
// Enable SPI, Master, set clock rate fck/128
// Sample on rising edge, output on falling
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(0<<CPHA)|(0<<CPOL);
}
char SPI_MasterTransmit(char cData)
{
// Start transmission
SPDR = cData;
// Wait for transmission complete
while(!(SPSR & (1<<SPIF))) ;
char receivedData = SPDR;
return receivedData;
}
char buffer[3];
int main(void)
{
SPI_MasterInit();
// Send 'Read JEDEC ID' command
setSSLow();
char status = SPI_MasterTransmit(0x9f);
// Get data
for (int i=0; i<3; i++) {
char data = SPI_MasterTransmit(0xff);
buffer[i] = data;
}
setSSHigh();
_delay_ms(1000);
while (1) {
// Do nothing
}
}
SCKyMOSI
SCKyMISO
Ahora estoy en un punto en el que no puedo pensar en otra cosa que hacer para tratar de solucionar este problema. ¡Sería muy útil para cualquier ayuda que pueda proporcionar! Esta es la primera vez que uso SPI y es muy difícil para mí depurar el hardware ya que tengo un fondo de software.
ACTUALIZACIÓN 1
Lo comprobé todo hoy y todo me parece correcto. Sin embargo, todavía obtengo el mismo resultado al leer el ID de JEDEC. Como se menciona en los comentarios a continuación, es una secuencia de bytes que se repite:
7c 20 6f 84 0d f0 81 be 10 37 c2 06 f8 40 df 08 1b e1 03
Como tenía el mismo chip en la carcasa de 16 pines, soldé rápidamente una tabla de ruptura y reemplacé el chip. Sorprendentemente me sale exactamente el mismo comportamiento. Definitivamente creo que hay algo mal en la forma en que lo hago, pero todavía no veo cómo ...
ACTUALIZACIÓN 2
Como ya mencioné en los comentarios, logré que el chip de memoria funcionara con un Arduino. Así que investigué más allá. Cargué el código que usé en el ATMega1284 directamente en el Arduino. Y adivina qué: funcionó fuera de la caja. Así que debe haber algo mal con el ATMega que estoy usando. Además, rápidamente escribí una implementación de software SPI utilizando otros pines y luego los utilizados por el hardware SPI. Y esto también funciona. Intentaré poner en mis manos otro ATMega1284 e intentarlo con ese. Supongo que rompí algo en el ATMega1284 ...
ACTUALIZACIÓN 3
Por accidente, solo logré comunicarme con el SSTV26 utilizando el SPI de hardware en el ATMega1284. Todavía tenía cables conectados a SS, MOSI y SCK que no estaban conectados a ninguna otra cosa. Cuando toco estos cables, la comunicación funciona. Cuando no los toco no funciona. Sospecho que hay algo flotando. No tengo las herramientas a mano en este momento.