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

 
 
> Отправляю пакет пр SPI
glebka
сообщение May 9 2006, 13:14
Сообщение #1


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

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



не могу понять,отправляю пакет через SPI, теряются биты.

AT91PS_SPI pSpi = AT91C_BASE_SPI;
AT91PS_AIC pAic = AT91C_BASE_AIC;

unsigned int temp;
unsigned int spib;

temp = pAic->AIC_IMR;

while(pSpi->SPI_SR & AT91C_SPI_TDRE==0);
pSpi->SPI_TDR = (data & 0xFFFF) | (CS << 16);

while(pSpi->SPI_SR & AT91C_SPI_RDRF==0);

pAic->AIC_IECR = temp;
spib=((pSpi->SPI_RDR) & 0xFFFF);
return spib;
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
glebka
сообщение May 9 2006, 17:54
Сообщение #2


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

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



Прошу прощения. за неправильно сформулированый вопрос. отправляю пакет из 48 битов(команду)в сторону sd карты.во время передачи видно как на осциллографе первый бит команды сдвигается на 1 байт по отношению к началу clk и плюс при по байтной отправке между отправленными байтами паузы во время которых проподает chip select . я грешу на неправильную установку spi.хотя пользуюсь примером кода взятого с форума и сайта Lamerka и работающего в другом устройстве.
может кто-нибудь подскажет. или где посмотреть пример кода. пример с olimex есть ,разобрал попробовал теже грабли.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 9 2006, 18:32
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Даю вырезки для работы с SPI LPC213x. Подойдёт и ко многим другим. С AT91 не знаком, так что немного переделаете. Вообще, процедуры написаны так, чтобы максимально использовать скорость процессора. То есть во время передачи байта можно выполнять другие действия.

Процедуры инициализации:

#define PCLKFREQ 14745600*4

void LPC213xInitSPI0Master()
{
PINSEL0 = (PINSEL0 & ~0xff00) | 0x1500; // for SCK0, MISO, MOSI, SSEL-
SPCCR0 = PCLKFREQ / 921600; // скорость = 0.6912 MHz (~80 КБ/сек)
SPCR0 = 0x20;
if (SPSR0) {}; // просто чтение для сброса флага SPIF
SPDR0 = '!'; // это чтобы изначально бит SPIF (TDRE) установился
}

void txByteSPI0(long byte)
{
if (SPSR0) {} // просто чтение для сброса флага SPIF
SPDR0 = byte;
}

long rxtxByteSPI0(long byte)
{
for(uInt i=0; i<0x10000; i++) // 1/50 sec - это на всякий случай. Всё бывает на свете!
if (SPSR0_bit.SPIF) // это бит завершения передачи байта в мастере (и приёма в слэйве)
{
long j = SPDR0;
if (byte >= 0) SPDR0 = byte;
return(j);
}
LPC213xInitSPI0Master();
return(0);
}

Рабочие процедуры:

void READ_ADS1218(uInt cmd, uInt cnt, uByte *ptr)
{
_ON_CS_ADS1218;
txByteSPI(cmd);
rxtxByteSPI(cnt-1);
_WAIT(_50Tosc);
rxtxByteSPI(0);
while (cnt--)
if (cnt) *ptr++ = rxtxByteSPI(0);
else *ptr = rxtxByteSPI(-1); // завершение передачи
_OFF_CS_ADS1218;
}

Пояснение:
В моей схеме был режим мастер, а вывод SSEL вообще не использовался. Сначала вручную сбрасывается сигнал ~CS на нужное внешнее устройство. Затем вызывается процедура передачи первого байта без анализа флагов (txByteSPI0(long byte)). После сколько угодно раз процедуру уже анализирующую флаги (rxtxByteSPI0(long byte)). Однако в конце нужно вызывать её же с параметром (-1). Она при этом ничего не передаёт, а просто ждёт завершения передачи последнего байта. После этого уже можно обратно вручную устанавливать вывод ~CS в еденицу (_OFF_CS_ADS1218).

Если не выжимать из процессора максимум скорости, то можно было бы сделать немного попроще. Но мне так больше нравится.

Если нужно просто выкинуть в SPI 6 байт то вот пример:

void Write6bytesSPI(uByte *ptr)
{
_ON_CS_ADS1218;
txByteSPI(*ptr++);
for (uInt i=0; i<5; i++) // здесь выкинуть именно 5, а не 6 байт. т.к. один уже выкинут
rxtxByteSPI(*ptr++);
rxtxByteSPI(-1); // завершение передачи
_OFF_CS_ADS1218;
}

Кстати, процедура (rxtxByteSPI0(long byte)) передаёт новый байт в SPI, но возвращает как бы предыдущий принятый байт. Осторожно!


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post



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

 


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


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