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

 
 
> Помогите разобраться с SSP LPC2366 в режиме SLAVE
Yaumen
сообщение Aug 18 2015, 09:21
Сообщение #1


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



Есть некое устройство (МАСТЕР) которое каждые 20 мс по SPI (частота SCK = 50кГц) посылает команду состоящую из 4-х байт:
[HEADER = 0x69] [СОСТОЯНИЕ 1] [СОСТОЯНИЕ 2] [КОНТРОЛЬНАЯ СУММА]

В моем устройстве, выполненном на LPC2366, эта команда поступает на интерфейс SSP0, который я настроил на режим SLAVE.
Код
    SSP0CPSR = ...;

    SSP0CR0 = 0x107; //8bit, SPI, CPOL=CPHA=0, SCR=1

        install_irq(SSP0_INT, (void*)SSP0Handler, HIGHEST_PRIORITY);

    SSP0CR1 = SSP0CR1_SSE|SSP0CR1_MS;        //SSP enabled in slave mode

        SSP0IMSC = 0x04; // Enable Receive Interrupt (RXIM only)


Прерывания от SSP срабатывают, однако сколько бы я не вычитывал SSP0DR, вычитывается только байт HEADER = 0x69, т.е весь массив bySpiData заполняется значениями 0x69
Код
volatile BYTE bySpiData[256];
volatile BYTE bySpiIndex = 0;
volatile DWORD dwSpiReceived = 0;

void SSP0Handler (void) __irq
{
    while (SSP0MIS_RXMIS & SSP0MIS)
    {    
        bySpiData[bySpiIndex++] = m_SSP0.Read() & 0xFF;
        dwSpiReceived++;
    }
    
    VICVectAddr = 0;            // Acknowledge Interrupt
}


Что я делаю не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Aug 20 2015, 07:57
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Yaumen @ Aug 18 2015, 15:21) *
while (SSP0MIS_RXMIS & SSP0MIS)
Что я делаю не так?

С чего это Вы наличие данных в FIFO определяете по регистру запросов прерывания??? Он тут вообще не при чём. Наличие данных в FIFO определяется по регистру статуса SSP (и соотв. флагу в нём).
А запрос прерывания надо просто сбросить через регистр сброса в начале ISR.

Цитата(Yaumen @ Aug 18 2015, 17:05) *
Да!!! Так и есть, каждый байт надо обязательно стробировать импульсом CS. Можно ли это отключить - не знаю, перепробовав различные режимы, так и не смог заставить работать как надо. Придется связываться с разработчиком МАСТЕРА, чтобы узнать возможно ли изменить его программу, чтобы каждый передаваемый байт стробировался CS.
Если кто-то знает способ как заставить LPC2366 работать без этой фичи или еще лучше вообще без использования SSEL, буду весьма признателен!!!

Оставьте разработчика мастера в покое. Всё прекрасно умеет LPC работать в любом режиме.
Единственный косяк с которым сталкивался в slave-SPI LPC - сигнал SSEL необходимо обязательно посадить на GND, даже если он не используется. Ну, или, если мастер выдаёт этот сигнал, подать его на соотв. ногу LPC.

PS: Читайте внимательнее мануал на SSP LPC.
Go to the top of the page
 
+Quote Post



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

 


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


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