Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: at45dbxxx и atmel
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
kostian296
не работал раньше с флешками.
контроллер 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));
demiurg_spb
Сделайте поиск по форуму.
Я уже выкладывал исходники для AT45DB321 (те же яйца - вид сбокуsmile.gif).
INT1
А так же AVR335 ,на gaw.ru (исходник есть) все нормально работает, чтоб не заморачиваться.
ЗЫ, по USART->SPI тоже нормально заливается на макс. скорости(115кбод)
kostian296
Цитата(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 ?
aaarrr
Цитата(kostian296 @ Oct 20 2008, 20:29) *
у флешки so - садить на MISO ?
si - на MOSI ?

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

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


Кто найдёт каки-либо траблы в исходниках - не стесняйтесь, пишите!
defunct
Цитата(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
shamray
Цитата(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);
}
kostian296
Цитата(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, что это может значить. икросхему я только от новую впаял ?
вот схема. может че та не так спаял ?

Нажмите для просмотра прикрепленного файла
kostian296
Цитата(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В память ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.