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

 
 
> Еще раз о SAM7, Непонятка с SPI
beer_warrior
сообщение Jul 1 2006, 20:19
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Вожусь с AT45DB081. Проинитил SPI вроде правильно - времянки заказанные, CS дергается как надо.
Пишу/читаю следующим кодом
Код
BYTE SPI_byte(BYTE b)
{
while(!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE));
AT91C_BASE_SPI->SPI_TDR = b;
return AT91C_BASE_SPI->SPI_RDR;
}

Запускаю простейшее - чтение статуса
Код
BYTE ReadStat(void)
{
SYNC_HI();SYNC_LO(); //это синхроимпульс для осцилла

SPI_byte(READ_STATUS);
return SPI_byte(0);
}

И что вижу - команда проходит нормально, а порожняковый байт нет.
Вставка еще одного SPI_byte(0); дает 16 клоков, но на SO Z-состояние - данных нет.
Что делать?


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
nameless
сообщение Jul 25 2006, 12:48
Сообщение #2


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

Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305



А вот у меня другая проблема - нижеприведенный кусок работает из main - а, но не работает в прерывании от таймера. Понимаю, что не в тему, но все-же почему флаг AT91C_SPI_TXEMPTY не сбрасывается если я его проверяю в теле обработчика. Такая же ерунда с флагом результатом от АЦП и TWI ????

А вот это работает:

u8 at45_check(u8 CS_num)
{
SPI_tr8(0x84, CS_num, 0);
BUFFER 0 write
SPI_tr8(0, CS_num, 0);
SPI_tr8(0, CS_num, 0);
SPI_tr8(0, CS_num, 0);
SPI_tr8(0xAA, CS_num, 1);
SPI_tr8(0xD4, CS_num, 0);
SPI_tr8(0, CS_num, 0);
SPI_tr8(0, CS_num, 0);
SPI_tr8(0, CS_num, 0);
SPI_tr8(0, CS_num, 0);
u8 read_test = SPI_tr8(0,CS_num,1);
if(read_test == 0xAA)return 1;
else return 0;
}//at45_check

u8 SPI_tr8(u8 byte, u8 cs_num, u8 last)
{
while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY));
//AT91F_SPI_CfgPCS(AT91C_BASE_SPI, 0x0E);
AT91F_SPI_PutChar(AT91C_BASE_SPI, (u16)byte, cs_num, last);
u8 returned = (u8)AT91F_SPI_GetChar(AT91C_BASE_SPI);
return returned;
}

Модифицированный AT91F_SPI_PutChar:

__inline void AT91F_SPI_PutChar (
AT91PS_SPI pSPI,
unsigned int character,
unsigned char cs_number,
unsigned char last)
{
unsigned int value_for_cs;
value_for_cs = (~(1 << cs_number)) & 0xF;
pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16) | (last << 24);
}
Go to the top of the page
 
+Quote Post



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

 


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


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