Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ATmega128 чтение/запись в FRAM(FM25640) по SPI 
:(
    Опции темы
Гость_Den
Дата 24.1.2005, 14:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Писал прогу для ATmega128 использовал SPI для связи с микросхемой "часы реального времени" (DS1305) - все нормально, все работает, попробовал FRAM - ну ни как не получается.
Помогите разобраться, если пришлете фрагмент кода буду признателен. Если что, пишите. Заранее спасибо.
[email protected]
  Вверх
PILOT
Дата 24.1.2005, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



А что такое FRAM? Внешнее ПЗУ?
Так вы посмотрите временные диаграммы DS1820 и FRAM'a может они просто разные?

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Гость_Den
Дата 25.1.2005, 08:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











FRAM - это энергонезависимое сегнетоэлектрическое ОЗУ
временные диаграммы у меня есть, там разница в командах.
Но почему не работает не пойму.
  Вверх
PILOT
Дата 25.1.2005, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



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

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Гость_Den
Дата 25.1.2005, 14:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Конечно, может я делаю что-то не так.
Тогда если не трудно посмотрите описание на то и другое.
И если что прояснится подскажите. Спасибо.

http://www.gaw.ru/pdf/Maxim/rtc/DS1305.pdf
http://www.ramtron.com/lib/literature/FM25640ds_r2.3.pdf
  Вверх
PILOT
Дата 26.1.2005, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



страница 12 и страница 8 соответственно. Там указано как писать и читать. И видна разница.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Гость_Den
Дата 26.1.2005, 08:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вы хотите сказать, что разница в том что во FRAM в отличие от часов посылается КОП и 2-х байтный адрес?
Если вы об этом, то я это учел, но ни чего хорошего не получилось.
Подскажите пожалуста, если я что-то не понимаю или что-то упустил из виду.
Да, еще вопрос, может надо сделать какую-нибудь инициализацию?
Заранее спасибо!
  Вверх
PILOT
Дата 26.1.2005, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



А вывод HOLD к плюс 5 Вольт подсоединен?
А про таблици 1 и 3 в документиции знаешь?

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Гость_Den
Дата 26.1.2005, 10:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Посмотрел схему, вход HOLD не запитан и вообще висит в воздухе.
так я что получается зря мучился и FRAM постоянно в режиме прерывания? Я правильно понял? Чтобы все работало надо подать +5В? А что с WP - входом?
  Вверх
PILOT
Дата 26.1.2005, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



WP тоже к +5Вольт. Иначе не сможешь писать в статус регистр (правда я не знаю насколько тебе это нужно).

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Гость_Den
Дата 27.1.2005, 08:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подключили HOLD к +5В, но все равно не получилось.
Я лучше прямо спрашу в моем коде есть ошибки?

; разрешение записи во FRAM
lds r16,BYTE_F_SPI
sbr r16,1 ; установить флаг "запись"
sts BYTE_F_SPI,r16
ldi r16,0
sts CNT_SPI,r16 ; записать кол-во байт записи
ldi r16,0x06 ;коп WREN
cbi PORTB,PB5 ; выбор FRAM /cs
out SPDR,r16 ; записать в регистр данных SPI
wait9: sbis PINB,PINB5
rjmp wait9

; запись во FRAM
lds r16,BYTE_F_SPI
sbr r16,1 ; установить флаг "запись"
sts BYTE_F_SPI,r16
ldi r16,6
sts CNT_SPI,r16 ; записать кол-во байт записи
ldi r16,high(BUFER)
sts ADR_BUF,r16 ; записать ст. байт нач. адрес буфера записи
ldi r16,low(BUFER)
sts ADR_BUF+1,r16 ; записать мл. байт нач. адрес буфера записи
clr r16
sts BUFER,r16
sts BUFER+1,r16
sts BUFER+2,r16
sts BUFER+3,r16
sts BUFER+4,r16
ldi r16,99
sts BUFER+5,r16

lds r16,BYTE_F_FM
sbr r16,2
sts BYTE_F_FM,r16
ldi r16,0x0
sts ADR_FM,r16
ldi r16,0x0
sts ADR_FM+1,r16

ldi r16,0x02 ;коп WRITE
cbi PORTB,PB5 ; выбор FRAM /cs
out SPDR,r16 ; записать в регистр данных SPI
wait: sbis PINB,PINB5
rjmp wait

;*****************************************************************************
;SPI_STC: п/п обработки завершения пересылки SPI
;*****************************************************************************
SPI_STC:

push r0
push r16
push zl
push zh
in r0,SREG
sei ; разрешить прерывание

lds r16,BYTE_F_FM
cpi r16,0
breq spi ;передача или прем данных

sbrs r16,1 ;передача ст.адреса FRAM
rjmp fm2
lds r16,BYTE_F_FM
cbr r16,2
sbr r16,4
sts BYTE_F_FM,r16
lds r16,ADR_FM
out SPDR,r16 ; записать данные в регистр данных SPI
rjmp end_spi
fm2: ;;передача мл.адреса FRAM
lds r16,BYTE_F_FM
clr r16
sts BYTE_F_FM,r16
ldi r16,ADR_FM+1
out SPDR,r16 ; записать данные в регистр данных SPI
rjmp end_spi

spi:
lds zh,ADR_BUF
lds zl,ADR_BUF+1
lds r16,BYTE_F_SPI
sbrs r16,0
rjmp not_write ; флаг операции "запись" не установлен
lds r16,CNT_SPI ; r16 - кол-во байт записи/чтени
tst r16
breq spi_1 ; кол-во байт = 0
lds r16,CNT_SPI ; r16 - кол-во байт записи
dec r16
sts CNT_SPI,r16 ; кол-во байт - 1
ld r16,z+ ; прочитать данные из ОЗУ
sts ADR_BUF,zh
sts ADR_BUF+1,zl ; ADR=ADR+1
out SPDR,r16 ; записать данные в регистр данных SPI
rjmp end_spi
not_write:
sbrs r16,1
rjmp read_spi ; флаг "начало чтения" не установлен
cbr r16,0b00000010 ; сбросить флаг "начало чтения"
sts BYTE_F_SPI,r16
rjmp spi_2
read_spi:
in r16,SPDR ; прочитать данные из регистра данных SPI
st z+,r16 ; записать данные в ОЗУ
sts ADR_BUF,zh
sts ADR_BUF+1,zl ; ADR=ADR+1
lds r16,CNT_SPI ; r16 - кол-во байт чтени
dec r16
sts CNT_SPI,r16 ; кол-во байт - 1
tst r16
breq spi_1 ; кол-во байт = 0
spi_2: ldi r16,0x55
out SPDR,r16 ; записать 55h в регистр данных SPI
rjmp end_spi
spi_1: lds r16,BYTE_F_SPI
cbr r16,0b00000001 ; сбросить флаг "запись"
sts BYTE_F_SPI,r16
cbi PORTB,PB0 ; сбросить флаг "часы выбраны"
sbi PORTB,PB5 ; сбросить флаг "FM выбран"
end_spi: out SREG,r0
pop zh
pop zl
pop r16
pop r0
reti

  Вверх
smalcom
Дата 27.1.2005, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: 4
Всего: 7



На мыло к тебе достучаца не получилось вот примерчик, у меня все работает

Код

//spi.c
void SPI_Init()
{
//init spi
SPCR = 0x50; //SPIE = 1, SPE = 1,  DORD = 0, MSTR = 1, CPOL = 0, CPHA = 0, baud rate f/4
SPSR = 0x00; //disable double speed
txproc = 0;
};

byte SPI_Write(byte x)
{
txproc = 1;//start transmit
SPDR = x;
while(!(SPSR & 0x80));
rxbuf = SPDR;
return rxbuf;
}



//eeprom.c
//control words for fm25160
#define wren 0x06
#define wrdi 0x04
#define rdsr 0x05
#define wrsr 0x01
#define read 0x03
#define write 0x02

byte ebuf, *w2b;
char str1[2] = {0x00, 0x00};
int Eeprom_Init()
{
byte i;
asm("sbi 0x18, 5"); // WP = 1
asm("cbi 0x18, 0"); // CS = 0
for(i = 0; i < 2; i++) asm("nop");
ebuf = SPI_Write(wren);//command writeenable
for(i = 0; i < 2; i++) asm("nop");
asm("sbi 0x18, 0"); // CS = 1
return RV_OK;
}

//following function write array _dta_ with length _n_ to eeprom at address _ad_
void Eeprom_Poke(byte ad, byte dta)
{
byte j;
asm("cbi 0x18, 0");//PORTB &= !SS;
for(j = 0; j < 2; j++) asm("nop");
ebuf = SPI_Write(write);
ebuf = SPI_Write(0x00);
ebuf = SPI_Write(ad);
ebuf = SPI_Write(dta);
for(j = 0; j < 2; j++) asm("nop");
asm("sbi 0x18, 0");//PORTB |= SS;
}

//following function read _dta_ from eeprom at address _ad_
void Eeprom_Peek(byte ad, byte *dta)
{
byte j;
asm("cbi 0x18, 0");//CS = 0
for(j = 0; j < 2; j++) asm("nop");
ebuf = SPI_Write(read);
ebuf = SPI_Write(0x00);
ebuf = SPI_Write(ad);
ebuf = SPI_Write(0x00);
*dta = ebuf;
for(j = 0; j < 2; j++) asm("nop");
asm("sbi 0x18, 0");//CS = 1
}

//and in main.c ....
/************************************************************************/
/* function SaveConf()       */
/* Store all configs and statistic in FRAM    */
/*         */
/************************************************************************/
void SaveConf()//near 65 mks
{
byte s, i;
asm("cbi 0x18, 0");//CS = 0
for(s = 0; s < 2; s++) asm("nop");
i = SPI_Write(0x06); //wren
for(s = 0; s < 2; s++) asm("nop");
asm("sbi 0x18, 0");//CS = 1
for(s = 0; s < 2; s++) asm("nop");
asm("cbi 0x18, 0");//CS = 0
for(s = 0; s < 2; s++) asm("nop");
i = SPI_Write(0x02);
i = SPI_Write(0x00);
i = SPI_Write(0x00);
//save denomination
i = SPI_Write(Stats.denom);
//save coinout
u2b = (byte*)&Stats.cte;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save payout
u2b = (byte*)&Stats.pte;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save all accepted bills
u2b = (byte*)&Stats.bl;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save bill per 1 uah
u2b = (byte*)&Stats.bl1;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save bill per 2 uah
u2b = (byte*)&Stats.bl2;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save bill per 5 uah
u2b = (byte*)&Stats.bl5;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save bill per 10 uah
u2b = (byte*)&Stats.bl10;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save bill per 20 uah
u2b = (byte*)&Stats.bl20;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save bill per 50 uah
u2b = (byte*)&Stats.bl50;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save bill per 100 uah
u2b = (byte*)&Stats.bl100;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
//save bill per 200 uah
u2b = (byte*)&Stats.bl200;
i = SPI_Write(u2b[0]);
i = SPI_Write(u2b[1]);
i = SPI_Write(u2b[2]);
i = SPI_Write(u2b[3]);
for(s = 0; s < 20; s++) asm("nop");
asm("sbi 0x18, 0");//CS = 1
}

/************************************************************************/
/* function LoadConf()       */
/* load all configs and statistic     */
/*         */
/************************************************************************/
byte LoadConf()
{
byte u2b[4];
byte s;
asm("cbi 0x18, 0");//CS = 0
for(s = 0; s < 20; s++) asm("nop");
s = SPI_Write(0x03);
s = SPI_Write(0x00);
s = SPI_Write(0x00);
//load denomination
Stats.denom = SPI_Write(0x00);
//load coinout
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.cte = u2b[0];
Stats.cte = (Stats.cte << 8) + u2b[1];
Stats.cte = (Stats.cte << 8) + u2b[2];
Stats.cte = (Stats.cte << 8) + u2b[3];
//load payout
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.pte = u2b[0];
Stats.pte = (Stats.pte << 8) + u2b[1];
Stats.pte = (Stats.pte << 8) + u2b[2];
Stats.pte = (Stats.pte << 8) + u2b[3];
//load all accepted bills
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.bl = u2b[0];
Stats.bl = (Stats.bl << 8) + u2b[1];
Stats.bl = (Stats.bl << 8) + u2b[2];
Stats.bl = (Stats.bl << 8) + u2b[3];
//load accepted bills per 1 uah
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.bl1 = u2b[0];
Stats.bl1 = (Stats.bl1 << 8) + u2b[1];
Stats.bl1 = (Stats.bl1 << 8) + u2b[2];
Stats.bl1 = (Stats.bl1 << 8) + u2b[3];
//load accepted bills per 2 uah
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.bl2 = u2b[0];
Stats.bl2 = (Stats.bl2 << 8) + u2b[1];
Stats.bl2 = (Stats.bl2 << 8) + u2b[2];
Stats.bl2 = (Stats.bl2 << 8) + u2b[3];
//load accepted bills per 5 uah
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.bl5 = u2b[0];
Stats.bl5 = (Stats.bl5 << 8) + u2b[1];
Stats.bl5 = (Stats.bl5 << 8) + u2b[2];
Stats.bl5 = (Stats.bl5 << 8) + u2b[3];
//load accepted bills per 10 uah
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.bl10 = u2b[0];
Stats.bl10 = (Stats.bl10 << 8) + u2b[1];
Stats.bl10 = (Stats.bl10 << 8) + u2b[2];
Stats.bl10 = (Stats.bl10 << 8) + u2b[3];
//load accepted bills per 20 uah
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.bl20 = u2b[0];
Stats.bl20 = (Stats.bl20 << 8) + u2b[1];
Stats.bl20 = (Stats.bl20 << 8) + u2b[2];
Stats.bl20 = (Stats.bl20 << 8) + u2b[3];
//load accepted bills per 50 uah
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.bl50 = u2b[0];
Stats.bl50 = (Stats.bl50 << 8) + u2b[1];
Stats.bl50 = (Stats.bl50 << 8) + u2b[2];
Stats.bl50 = (Stats.bl50 << 8) + u2b[3];
//load accepted bills per 100 uah
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.bl100 = u2b[0];
Stats.bl100 = (Stats.bl100 << 8) + u2b[1];
Stats.bl100 = (Stats.bl100 << 8) + u2b[2];
Stats.bl100 = (Stats.bl100 << 8) + u2b[3];
//load accepted bills per 200 uah
u2b[3] = SPI_Write(0x00);
u2b[2] = SPI_Write(0x00);
u2b[1] = SPI_Write(0x00);
u2b[0] = SPI_Write(0x00);
Stats.bl200 = u2b[0];
Stats.bl200 = (Stats.bl200 << 8) + u2b[1];
Stats.bl200 = (Stats.bl200 << 8) + u2b[2];
Stats.bl200 = (Stats.bl200 << 8) + u2b[3];
for(s = 0; s < 20; s++) asm("nop");
asm("sbi 0x18, 0");//CS = 1
return 0x00;
}




--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
Гость_Den
Дата 28.1.2005, 09:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я конечно в Си не очень, но огромное спасибо за помощь.
Я свое немного подкорректировал и все получилось.

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.