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

 
 
 
Reply to this topicStart new topic
> AT91SAM7 + AT45DB642 статус
MegaFPGA
сообщение Jun 8 2010, 10:46
Сообщение #1


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

Группа: Участник
Сообщений: 75
Регистрация: 12-11-09
Из: Уфа
Пользователь №: 53 567



Пытаюсь прочитать статус флэшки командами 0x57 и 0xD7:
По сути делаю вот что:
pSPI ->SPI_TDR= 0x57 ; // запись в регистр передачи SPI команды для флэшки
DataReceived=pSPI->SPI_RDR; // чтение принятых по SPI данных

DataReceived имеет то же значение что и код команды. Осциллом видно что на MISO действительно тот же самый код. Т.е. флешка возвращает мне то что я ей отправил. Пробовал ставить задержку вразные места проги. Все равно результат тот же.
хелп.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 8 2010, 10:53
Сообщение #2


Гуру
******

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



Вы должны отправить (и, соответственно, принять) минимум два байта, ответы с содержимым статусного регистра пойдут начиная со второго. Не может же флеш отвечать, еще не получив код команды.
Go to the top of the page
 
+Quote Post
MegaFPGA
сообщение Jun 9 2010, 02:15
Сообщение #3


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

Группа: Участник
Сообщений: 75
Регистрация: 12-11-09
Из: Уфа
Пользователь №: 53 567



а разве команда DataReceived=pSPI->SPI_RDR; не выдает байт для того чтоб выдвинуть байт из слейва ?
Go to the top of the page
 
+Quote Post
MegaFPGA
сообщение Jun 9 2010, 03:19
Сообщение #4


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

Группа: Участник
Сообщений: 75
Регистрация: 12-11-09
Из: Уфа
Пользователь №: 53 567



Пробовал делать как вы говорите. Тот же результат. Флешка вседа возвращает то же что ей отправил.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 06:00
Сообщение #5


Гуру
******

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



Цитата(MegaFPGA @ Jun 9 2010, 06:15) *
а разве команда DataReceived=pSPI->SPI_RDR; не выдает байт для того чтоб выдвинуть байт из слейва ?

Разумеется, нет. Чтение RDR не вызывает никаких эффектов, кроме сброса флага RDRF.

Цитата(MegaFPGA @ Jun 9 2010, 07:19) *
Пробовал делать как вы говорите. Тот же результат. Флешка вседа возвращает то же что ей отправил.

Окончания передачи подождать не забываете?
Код
unsigned int spi0_trans(unsigned int data)
{
    AT91C_BASE_SPI0->SPI_TDR = data;
    while(!(AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_RDRF));
    return (AT91C_BASE_SPI0->SPI_RDR);
}
Go to the top of the page
 
+Quote Post
MegaFPGA
сообщение Jun 9 2010, 08:24
Сообщение #6


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

Группа: Участник
Сообщений: 75
Регистрация: 12-11-09
Из: Уфа
Пользователь №: 53 567



Нет не забываю. Отрезал дорожку MISO от флешки. Оказывается во время передачи и на MISO те же сигналы что и на MOSI. Прозвонка показывает 8КОм между этими ножками.
help.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2010, 08:30
Сообщение #7


Гуру
******

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



Цитата(MegaFPGA @ Jun 9 2010, 12:24) *
Прозвонка показывает 8КОм между этими ножками.

Значит флеш просто и не отвечала. CS выставляется нормально? Интерфейс выбран правильно?

8кОм похоже на грязную плату. Промойте получше.
Go to the top of the page
 
+Quote Post
MegaFPGA
сообщение Jun 11 2010, 05:53
Сообщение #8


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

Группа: Участник
Сообщений: 75
Регистрация: 12-11-09
Из: Уфа
Пользователь №: 53 567



Оказалось одна из микросхем на плате коротила MOSI и MISO.

Сейчас другая проблема. Флешка на команды запроса статуса выдает однобокую пилу. На команды чтения выдает какие то очень мелкие сильно зашумленные расплывчатые прямоугольные импульсы. Контроллер их распознает как 0. Смотрел осциллом при подключенном к контроллеру MISO и висящем в воздухе. Результат одинаковый.

Пробовал менять флешку результат тот же.
Вот код работы с флешкой:
CODE


unsigned char waitflash()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
unsigned char flag =0;
unsigned char get=0;
pSPI ->SPI_TDR = 0xD7;
get = pSPI ->SPI_RDR;
flag = ((get)>>7)&1;
if(flag)
return 1;


}

void waitspisend()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
unsigned int flag =0;
while(!flag)
{flag=pSPI ->SPI_SR;
flag=flag&0x00000200;}


}
void SPISendByte(unsigned char SPIDataToSend)
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
pSPI ->SPI_TDR= ((unsigned int)(SPIDataToSend))&0x000000FF;
waitspisend();
}
unsigned int SPIReceiveByte()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
unsigned char DataReceived = 0;
DataReceived=pSPI->SPI_RDR;
waitspireceive();
return (DataReceived);
}

void waitspireceive()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
unsigned int flag =0;
while(!flag)
{flag=pSPI ->SPI_SR;
flag=flag&0x00000201;}
}
void muchenieflash()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
AT91PS_PIO pPIO = AT91C_BASE_PIOA;
while(1){
unsigned char rec[1056];
unsigned int stats=0;
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA, // PIO controller base address
((unsigned int) AT91C_PA13_MOSI ) |
((unsigned int) AT91C_PA31_NPCS1 ) |
((unsigned int) AT91C_PA14_SPCK ) |
//((unsigned int) AT91C_PA11_NPCS0 ) |
((unsigned int) AT91C_PA12_MISO ), // Peripheral A
//((unsigned int) AT91C_PA9_NPCS1 ) |
//((unsigned int) AT91C_PA22_NPCS3 ) |
//((unsigned int) AT91C_PA3_NPCS3 ) |
//((unsigned int) AT91C_PA5_NPCS3 ) |
//((unsigned int) AT91C_PA10_NPCS2 ) |
((unsigned int) AT91C_PA30_NPCS2 )); // Peripheral B
AT91F_SPI_CfgPMC ();
AT91F_SPI_SWReset (AT91C_BASE_SPI);
pSPI ->SPI_CR = 0x01;
//(Last Transfer=0)+(SPI Software Reset=0)+(SPI Disable=0)+(SPI Enable=1)
pSPI ->SPI_MR = 0x0F030011;
//(Delay Between Chip Selects=F)+(Local loopback path disabled)+(CS2)
+(Mode fault detection is disabled)+(chip selects are directly connected)+(fixed CS)+(master mode)
pSPI ->SPI_IER = 0x0;// все прерывания отключены
pSPI ->SPI_IDR = 0x3FF;// все прерывания отключены
pSPI ->SPI_IMR = 0x0;// все прерывания замаскированы
pSPI ->SPI_CSR[2] = 0x0F0F1F02;
// (max Consecutive Transfers delay)+(max delay)+(min baud rate)
+(8 bit)+(Chip Select Active After Transfer)+(NPCHA=0)+(CPOL=1)


AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,(unsigned int)1<<23);
AT91F_PIO_Enable(AT91C_BASE_PIOA,(unsigned int)1<<23);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,(unsigned int)1<<23);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,(unsigned int)1<<23);


SPISendByte(0x57);
SPISendByte(0xFF);
delaytest(0xFFF);
stats = SPIReceiveByte();
SPISendByte(0xD7);
SPISendByte(0xFF);
delaytest(0xFFF);
rec[0] = SPIReceiveByte();
stats=stats;


SPISendByte(0x84);// запись в буфер
SPISendByte(0);
SPISendByte(0);
SPISendByte(0);

unsigned short int p=0;
for(p=0;p<1056;p++)
{
SPISendByte(0xAA);
}

SPISendByte(0x54);// чтение из буфера
SPISendByte(0);
SPISendByte(0);
SPISendByte(0);

for(p=0;p<1056;p++)
{ SPISendByte(0xFF);
rec[p] = SPIReceiveByte();
}
p++;
}
}



Запускается функция muchenieflash(). Далее инициализация, передача разных команд. Код корявый но это только для теста.

Сообщение отредактировал MegaFPGA - Jun 11 2010, 05:55
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 11 2010, 06:34
Сообщение #9


Гуру
******

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



Цитата(MegaFPGA @ Jun 11 2010, 09:53) *
Код корявый но это только для теста.

Код настолько корявый, что совершенно отбивает желание его изучать. SPISendByte и SPIReceiveByte сделаны просто неправильно, подумайте о поведении флага RDRF.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 11 2010, 07:57
Сообщение #10


Гуру
******

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



Да, и еще раз внимательно проверьте железо. Питание до AT45 доходит?
Go to the top of the page
 
+Quote Post
MegaFPGA
сообщение Jun 11 2010, 07:58
Сообщение #11


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

Группа: Участник
Сообщений: 75
Регистрация: 12-11-09
Из: Уфа
Пользователь №: 53 567



С флагом понятно. А как правильно организовать прием передачу ?
Питание доходит. Сигналы SPI доходят нормально. Флешка выдает мусор.

Сообщение отредактировал MegaFPGA - Jun 11 2010, 07:59
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 11 2010, 08:04
Сообщение #12


Гуру
******

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



Цитата(MegaFPGA @ Jun 11 2010, 11:58) *
С флагом понятно. А как правильно организовать прием передачу ?

Один из вариантов я приводил выше. И настоятельно рекомендую не использовать аппаратный CS там, где в этом нет необходимости.
Go to the top of the page
 
+Quote Post
MegaFPGA
сообщение Jun 11 2010, 08:46
Сообщение #13


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

Группа: Участник
Сообщений: 75
Регистрация: 12-11-09
Из: Уфа
Пользователь №: 53 567



Пробовал CS дергать вручную. Все проверил. Железо в норме. Ох уж не знаю в чем дело. Наверное все-таки в неправильном испоьзовании SPI.
Go to the top of the page
 
+Quote Post

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

 


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


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