Перейти к содержанию
    

AVR - FRAM FM25CL64B

Доброго времени суток! Начал осваивать работу с FRAM FM25CL64B. Контроллер -AVR mega16, копмилятор Написал тестовую программу записи / считывания (при отправке на mega16 по USART любого байта пишу и считываю). Только вот приходят одни нули. На MISO FRAM - низкий уровень, в то время как осуществляю чтение. Выкладываю код программки, может кто что подскажет. Заранее спасибо!

#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
#include <string.h>

#pragma interrupt_handler UART_RX_interrupt:12

#define ToggleBit(x, bit) (x^=(1<<bit))

static volatile unsigned char readdata=0x00;
static volatile unsigned char readdata1=0x00;
static volatile unsigned char readdata2=0x00;

void InitUART(void)
{
    UBRRL = 0X03;        // baud rate = 115200
    UBRRH = 0x00;
    UCSRA = 0x00;
    UCSRB = (1<<RXEN)|(1<<TXEN);
    UCSRC = (3<<UCSZ0)|(0<<USBS)|(1<<URSEL);
     /* Set frame format: 8data, 1stop bit */
    UCSRC = (1<<URSEL)|0x06;
}

void SPI_MasterInit(void)
{
/* Set MOSI, chip select and SCK (clock) output, MISO - input */
DDRB |= (1<<PB7)|(0<<PB6)|(1<<PB5)|(1<<PB4);
PORTB |= 0b01000000; // подтягиваем пин входа

/* Enable SPI, Master, set clock rate fck/16 */
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);                    //SPI Enable, SCK frequency = fosc/16

//SPCR |=(0x0C);
}

void SPI_MasterTransmit(unsigned char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}

void UART_RX_interrupt( void )
{  
     // отправляю данные   
     PORTB &= ~0b00010000;   // chip select в 0
     SPI_MasterTransmit(0b00000110);//wren
     SPI_MasterTransmit(0b00000010); //write
     SPI_MasterTransmit(0b00000011); //address
     SPI_MasterTransmit(0b00000011); //address
     SPI_MasterTransmit(0b01011100); //data
     SPI_MasterTransmit(0b00001111); //data
     SPI_MasterTransmit(0b11110000); //data
     PORTB |= 0b00010000;    // chip select в 1
     ////////////////////////////////////////////
     
    // считываю
    PORTB &= ~0b00010000;   // chip select в 0
    SPI_MasterTransmit(0b00000110); //wren
    SPI_MasterTransmit(0b00000011); //read
    SPI_MasterTransmit(0b00000011); //address
    SPI_MasterTransmit(0b00000011); //address
        
    //SPCR |=(0x0C);
    SPI_MasterTransmit(0xff);   // бросаем данные чтобы генерировались такты на sck
    readdata= SPDR;//            // считываю данные
    SPI_MasterTransmit(0xff);
    readdata1= SPDR;
    SPI_MasterTransmit(0xff);
    readdata2= SPDR;
    PORTB |= 0b00010000;            // chip select в 1
    /////////////////////////////////////////////////////////////////
    
     while(!( UCSRA & (1 << UDRE)));
        UDR = readdata;                    //передаю на PC по USART
        while(!( UCSRA & (1 << UDRE)));
        UDR = readdata1;
        while(!( UCSRA & (1 << UDRE)));
        UDR = readdata2;
        
    ToggleBit(DDRC,7);        //мигаю диодом
        
}   

void main(void)
{
    SPI_MasterInit();
    InitUART();
    UCSRB |= (1<<RXCIE); // enable UART interrupts
     
     while(1)
        {
                 SEI();    
                
        }

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

WREN пишется в отдельном цикле доступа (опустить-поднять чипселект) перед каждым WRITE. Про это написано и в даташите и в том примере, что я Вам отослал и который Вы получили.

Кроме того, чипселект должен быть в "1" до того как начнёте что-то делать с микросхемой. У Вас же после инициализации CS держится в "0" - потом начинаем инициализировать SPI..

С остальным в вашем коде (например, какой именно SPI MODE используется - их список тоже в даташите) не разбирался.

Не забыли, что всё должно питаться от +3.3? Судя по инициализации USART, тактовая процессора 8 МГц - серия процессора L или A будет работать нормально.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо так и сделал, заработало. Wren "оформил" одтельным чип селектом и все остальное тоже отдельным получилось так:

//запись:

PORTB &= ~0b00010000;
     SPI_MasterTransmit(0b00000110);//wren
     PORTB |= 0b00010000;
      
     PORTB &= ~0b00010000; 
     SPI_MasterTransmit(0b00000010); //write
     SPI_MasterTransmit(0b00000000); //address
     SPI_MasterTransmit(0b00000011); //address
     SPI_MasterTransmit(0b01011100); //data
     SPI_MasterTransmit(0b00001111); //data
     SPI_MasterTransmit(0b11110000); //data
     PORTB |= 0b00010000;
//считывание:     
     PORTB &= ~0b00010000;
     SPI_MasterTransmit(0b00000110); //wren
     PORTB |= 0b00010000;
      
     PORTB &= ~0b00010000; 
     SPI_MasterTransmit(0b00000011); //read
     SPI_MasterTransmit(0b00000000); //address
     SPI_MasterTransmit(0b00000011); //address
     // PORTB |= 0b01000000;
     
     SPI_MasterTransmit(0xff);
     readdata= SPDR;// while(!(SPSR & (1<<SPIF)));    
     SPI_MasterTransmit(0xff);
     readdata1= SPDR;
     SPI_MasterTransmit(0xff);
     readdata2= SPDR;
    
    PORTB |= 0b00010000;

 

 

 

 

P.S. :модераторам - тему случайно продублировал, удаляйте если нужно одну из двух

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

WREN при чтении не требуется.

Ну и если на будущее - используйте HEX форму записи констант. Считать позицию битов с экрана просто никак невозможно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надеюсь, сделать начальное состояние CS "1" не забыли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...