Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPI Eeprom M95080+mega64
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ipkin
подскажите что не так в проге
еепром полностью записываться не хочет максимум 159байт может и меньше
вот код:
#include <mega64.h>
#include <stdlib.h>
#include <delay.h>

//Настройка регистров Mega64
void Init()
{
MCUCR=0xC0;
XMCRA=0x02;
TIMSK=0x00;
ACSR=0x80;
}

void Load()
{
static unsigned long int j;
PORTB= 0x0D;
DDRB = 0x07; // Настройка выводов порта PortB
SPCR = 0x5D; // Конфигурация SPI

for (j=0;j<1024;j++)
{
PORTB.0=0; // enable eeprom 95080
delay_ms(20);

SPDR=0x06; //Передача команды WREN (Set Write Enable Latch)
while (!(SPSR & 0x80));
PORTB.0=1;
delay_ms(20);
PORTB.0=0;

//Передача команды WRITE (Write Data to Memory Arry)
SPDR=0x02;
while (!(SPSR & 0x80));

//Передача адреса куда будем записывать (2 байта 0000h)
SPDR=0x00;
while (!(SPSR & 0x80));

SPDR=0x00+j;
while (!(SPSR & 0x80));

//Передача данных

SPDR=0x11;
while (!(SPSR & 0x80));

PORTB.0=1;
delay_ms(20);
}
}
void main(void)
{
Init();
Load();
loop:
goto loop;
}
AHTOXA
Цитата(ipkin @ Jun 12 2008, 01:47) *
Код
    static unsigned long int j;


Если адрес - 2 байта, то достаточно unsigned int.

Цитата
Код
    //Передача адреса куда будем записывать (2 байта 0000h)
    SPDR=0x00;
    while (!(SPSR & 0x80));
    
    SPDR=0x00+j;
    while (!(SPSR & 0x80));


Вот здесь ошибка. Старший байт адреса передаётся всё время нулевой.
надо примерно так:
Код
    SPDR=j>>8;
    while (!(SPSR & 0x80));
    
    SPDR=j;
    while (!(SPSR & 0x80));


Ну и 20 миллисекунд задержки на байт данных это явно переборsmile.gif
rezident
Может я чего-то не понимаю, потому что программа не полная? Но где у вас проверка готовности EEPROM для чтения/записи после записи? Где выравнивание на границу страницы/буфера?
ipkin
Цитата(AHTOXA @ Jun 11 2008, 23:23) *
Если адрес - 2 байта, то достаточно unsigned int.
Вот здесь ошибка. Старший байт адреса передаётся всё время нулевой.
надо примерно так:
Код
    SPDR=j>>8;
    while (!(SPSR & 0x80));
    
    SPDR=j;
    while (!(SPSR & 0x80));


Ну и 20 миллисекунд задержки на байт данных это явно переборsmile.gif

АНТОХА большое спасибо действительно поправил как ты сказал всё завелось.
я только начинаю на Си подумал что автоматом старший байт будет инкрементироваться учусь
ещё раз спасибо за подсказку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.