реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> at45dbxxx и atmel, не могу никак связаться с памятью
kostian296
сообщение Oct 20 2008, 16:03
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 20-10-08
Пользователь №: 41 074



не работал раньше с флешками.
контроллер tamega168. флешка at45db161su.
кварц 11.059мгц.

void spi_init(void)
{
SPCR = 0x5c; //setup SPI
SPSR = 0x00; //setup SPI
}

CS_ON;
Kod=0x9F; /* manufacture and device id read */
SPDR = Kod; // ?????? ???? ??? ???????? ? ???
while(!(SPSR & 0x80));
M[0]=SPDR;
SPDR = 0xff; // ?????? ???? ??? ???????? ? ???
while(!(SPSR & 0x80));
M[1]=SPDR;

нет ответа от флешки. на этой строке виснет: while(!(SPSR & 0x80));
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 20 2008, 16:07
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Сделайте поиск по форуму.
Я уже выкладывал исходники для AT45DB321 (те же яйца - вид сбокуsmile.gif).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
INT1
сообщение Oct 20 2008, 16:16
Сообщение #3


deleted
****

Группа: Свой
Сообщений: 555
Регистрация: 28-08-05
Пользователь №: 8 024



А так же AVR335 ,на gaw.ru (исходник есть) все нормально работает, чтоб не заморачиваться.
ЗЫ, по USART->SPI тоже нормально заливается на макс. скорости(115кбод)
Go to the top of the page
 
+Quote Post
kostian296
сообщение Oct 20 2008, 16:29
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 20-10-08
Пользователь №: 41 074



Цитата(demiurg_spb @ Oct 20 2008, 19:07) *
Сделайте поиск по форуму.
Я уже выкладывал исходники для AT45DB321 (те же яйца - вид сбокуsmile.gif).

можешь кинуть на kostiapan@mail.ru

Цитата(INT1 @ Oct 20 2008, 19:16) *
А так же AVR335 ,на gaw.ru (исходник есть) все нормально работает, чтоб не заморачиваться.
ЗЫ, по USART->SPI тоже нормально заливается на макс. скорости(115кбод)

у флешки so - садить на MISO ?
si - на MOSI ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 20 2008, 16:35
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(kostian296 @ Oct 20 2008, 20:29) *
у флешки so - садить на MISO ?
si - на MOSI ?

Да, но это абсолютно не важно, если:
Цитата(kostian296 @ Oct 20 2008, 20:03) *
нет ответа от флешки. на этой строке виснет: while(!(SPSR & 0x80));

вот уж виснуть он не должен никак.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 20 2008, 17:03
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(kostian296 @ Oct 20 2008, 20:29) *
можешь кинуть на ...


Кто найдёт каки-либо траблы в исходниках - не стесняйтесь, пишите!
Прикрепленные файлы
Прикрепленный файл  df_driver.rar ( 3.94 килобайт ) Кол-во скачиваний: 48
 


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 20 2008, 17:10
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Oct 20 2008, 19:35) *
вот уж виснуть он не должен никак.

Абсолютно точно. А коль уж он виснет на этой строчке, то возможно что-то не так с SS:

When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the
direction of the SS pin.
If SS is configured as an output, the pin is a general output pin which does not affect the SPI
system. Typically, the pin will be driving the SS pin of the SPI Slave.
If SS is configured as an input, it must be held high to ensure Master SPI operation. If the SS pin
is driven low by peripheral circuitry when the SPI is configured as a Master with the SS pin
defined as an input, the SPI system interprets this as another master selecting the SPI as a
slave and starting to send data to it. To avoid bus contention, the SPI system takes the following
actions: ....


попробуйте проинициализировать SPI и PORTB так:

Код
#define SPI_SCK  PB5
#define SPI_MOSI PB4
#define SPI_MISO PB3
#define SPI_SS   PB2

    // initialize PORTB for SPI
    DDRB |= (1 << SPI_MOSI)|(1 << SPI_SCK)|(1 << SPI_SS);
    DDRB &= ~(1 << SPI_MISO);

    // Enable SPI in mode 3 Master, set clock rate fck/4
    SPCR = (1 << SPE)|(1 <<MSTR)|(1 << CPOL)|(1 << CPHA);
    SPSR = (1 << SPI2X); // 2x rate
Go to the top of the page
 
+Quote Post
shamray
сообщение Oct 20 2008, 18:03
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 114
Регистрация: 31-08-05
Из: Украина, Одесса
Пользователь №: 8 105



Цитата(defunct @ Oct 20 2008, 20:10) *
Абсолютно точно. А коль уж он виснет на этой строчке, то возможно что-то не так с SS:


SS надо конфижить обязательно, иначе сбрасывается флаг установки режима Master. Сам когда-то на эти грабли наступал.

Код
void SPI_Init(void)
{
  PORTB_Bit2 = HI;
  DDRB_Bit2 = OUT;
  
  SPI_PORT |= (1<<SCK)|(1<<MOSI)|(1<<MISO);
  
  SPI_DDR |= (1<<MOSI)|(1<<SCK);
  SPI_DDR &= ~(1<<MISO);
  
  SPSR = (1<<SPI2X);
  SPCR = (1<<MSTR) | (1<<SPE) | (1<<CPOL) | (1<<CPHA); //Mode 3
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Записываем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Write_Byte(u08 b)
{
  SPDR = b;
  while (!(SPSR & (1<<SPIF))); // wait for data transfer to be completed  
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Читаем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u08 SPI_Read_Byte(void)
{
  SPDR = 0x00;
  while (!(SPSR & (1<<SPIF))); // wait for data transfer to be completed
  return SPDR;
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Чтение manufacturer ID
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u08 at45ReadVID(u08 chip_num)
{

  AT45_ON();                       //установим CS для DataFlash
  SPI_Write_Byte(0x9f);   //передаем номер команды
  BYTE ID=SPI_Read_Byte();                                   //читаем регистр статуса
  SPI_Write_Byte(0);                                     //читаем регистр статуса
  SPI_Write_Byte(0);                                     //читаем регистр статуса
  SPI_Write_Byte(0);                                     //читаем регистр статуса
  AT45_OFF();                     //сбросим CS для DataFlash

  return(ID);
}
Go to the top of the page
 
+Quote Post
kostian296
сообщение Oct 22 2008, 16:37
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 20-10-08
Пользователь №: 41 074



Цитата(shamray @ Oct 20 2008, 21:03) *
SS надо конфижить обязательно, иначе сбрасывается флаг установки режима Master. Сам когда-то на эти грабли наступал.

Код
void SPI_Init(void)
{
  PORTB_Bit2 = HI;
  DDRB_Bit2 = OUT;
  
  SPI_PORT |= (1<<SCK)|(1<<MOSI)|(1<<MISO);
  
  SPI_DDR |= (1<<MOSI)|(1<<SCK);
  SPI_DDR &= ~(1<<MISO);
  
  SPSR = (1<<SPI2X);
  SPCR = (1<<MSTR) | (1<<SPE) | (1<<CPOL) | (1<<CPHA); //Mode 3
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Записываем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Write_Byte(u08 b)
{
  SPDR = b;
  while (!(SPSR & (1<<SPIF))); // wait for data transfer to be completed  
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Читаем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u08 SPI_Read_Byte(void)
{
  SPDR = 0x00;
  while (!(SPSR & (1<<SPIF))); // wait for data transfer to be completed
  return SPDR;
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Чтение manufacturer ID
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u08 at45ReadVID(u08 chip_num)
{

  AT45_ON();                       //установим CS для DataFlash
  SPI_Write_Byte(0x9f);   //передаем номер команды
  BYTE ID=SPI_Read_Byte();                                   //читаем регистр статуса
  SPI_Write_Byte(0);                                     //читаем регистр статуса
  SPI_Write_Byte(0);                                     //читаем регистр статуса
  SPI_Write_Byte(0);                                     //читаем регистр статуса
  AT45_OFF();                     //сбросим CS для DataFlash

  return(ID);
}

спасибо. попробовал. виснуть не стало.
но. при ситывании id=0, что это может значить. икросхему я только от новую впаял ?


Цитата(kostian296 @ Oct 22 2008, 19:27) *
спасибо. попробовал. виснуть не стало.
но. при ситывании id=0, что это может значить. икросхему я только от новую впаял ?

вот схема. может че та не так спаял ?


Цитата(kostian296 @ Oct 22 2008, 19:33) *
спасибо. попробовал. виснуть не стало.
но. при ситывании id=0, что это может значить. икросхему я только от новую впаял ?
вот схема. может че та не так спаял ?

Прикрепленный файл  Flash_USB.zip ( 25.01 килобайт ) Кол-во скачиваний: 123
Go to the top of the page
 
+Quote Post
kostian296
сообщение Oct 25 2008, 10:16
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 20-10-08
Пользователь №: 41 074



Цитата(defunct @ Oct 20 2008, 20:10) *
Абсолютно точно. А коль уж он виснет на этой строчке, то возможно что-то не так с SS:

When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the
direction of the SS pin.
If SS is configured as an output, the pin is a general output pin which does not affect the SPI
system. Typically, the pin will be driving the SS pin of the SPI Slave.
If SS is configured as an input, it must be held high to ensure Master SPI operation. If the SS pin
is driven low by peripheral circuitry when the SPI is configured as a Master with the SS pin
defined as an input, the SPI system interprets this as another master selecting the SPI as a
slave and starting to send data to it. To avoid bus contention, the SPI system takes the following
actions: ....
попробуйте проинициализировать SPI и PORTB так:

Код
#define SPI_SCK  PB5
#define SPI_MOSI PB4
#define SPI_MISO PB3
#define SPI_SS   PB2

    // initialize PORTB for SPI
    DDRB |= (1 << SPI_MOSI)|(1 << SPI_SCK)|(1 << SPI_SS);
    DDRB &= ~(1 << SPI_MISO);

    // Enable SPI in mode 3 Master, set clock rate fck/4
    SPCR = (1 << SPE)|(1 <<MSTR)|(1 << CPOL)|(1 << CPHA);
    SPSR = (1 << SPI2X); // 2x rate


Какое питание необходимо подать на память ?
В даташите написано, что поддерживате 2.7-3.6В, но потом напимано что AT45DB161 - это 2.7В память ?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 20:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01474 секунд с 7
ELECTRONIX ©2004-2016