InsolentS 0 29 августа, 2009 Опубликовано 29 августа, 2009 · Жалоба Не знаю, сделал ли я большое открытие, но SSP всё-таки дёргает аппаратно SSEL !! Надо просто вешать на этот вывод подтяжку, т.к. в данном случае тип выхода меняется на открытый коллектор. Лично я долго парился по этому вопросу, в интернете ничего нет на эту тему, в даташите тоже не ясно. Видел многих кто плюнул и работал с SSEL через GPIO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 августа, 2009 Опубликовано 29 августа, 2009 · Жалоба Не знаю, сделал ли я большое открытие, но SSP всё-таки дёргает аппаратно SSEL ... в даташите тоже не ясно. Полагаю, что после таких заявлений подпись про "курильщика даташитов..." придется убрать :(" Slave Select/Frame Sync/Chip Select. When the SSP is a bus master, it drives this signal from shortly before the start of serial data, to shortly after the end of serial data, to signify a data transfer as appropriate for the selected bus and mode. When the SSP is a bus slave, this signal qualifies the presence of data from the Master, according to the protocol in use. When there is just one bus master and one bus slave, the Frame Sync or Slave Select signal from the Master can be connected directly to the slave’s corresponding input. When there is more than one slave on the bus, further qualification of their Frame Select/Slave Select inputs will typically be necessary to prevent more than one slave from responding to a transfer. Какие именно моменты из отцитированного выше не ясны? Надо просто вешать на этот вывод подтяжку, т.к. в данном случае тип выхода меняется на открытый коллектор. Тоже нет. Видел многих кто плюнул и работал с SSEL через GPIO. Я и не такое видел, ну и что? И сам работаю через GPIO, если нужно обеспечить постоянное наличие SSEL при передаче потока байтов вне зависимотси от темпа их запихивания в FIFO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
InsolentS 0 29 августа, 2009 Опубликовано 29 августа, 2009 · Жалоба Тоже нет. Проверьте у себя, без подтяжки SSP машет чип-селектом только в режиме microwire или SSI, но не SPI. И в даташите на этот счёт ничего нет, тот кусок что Вы привели, я выучил наизусть уже :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 августа, 2009 Опубликовано 29 августа, 2009 · Жалоба .. Не морочте людям голову. В документации ясно описано и поведение SSEL0, SSEL1 и различие в их поведении, и НЕ описан ни один из SSEL как OD. LPC213x/LPC214x оба SPI документации соответствуют. И SSEL1 в SSP в LPC21x всё-таки машет аппаратно! Машет не "все-таки" а в полном соответствии с документацией, чем и пользуюсь с момента появления SSP у первых LPC213x. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgen2 0 2 сентября, 2009 Опубликовано 2 сентября, 2009 (изменено) · Жалоба чем и пользуюсь с момента появления SSP у первых LPC213x. а не покажете бестолковому, как использовать SSP для связи двух LPC213x ? Вроде бы все делаю как надо, а куда-то не туда все уходит :-/. Изменено 2 сентября, 2009 пользователем evgen2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 2 сентября, 2009 Опубликовано 2 сентября, 2009 · Жалоба а не покажете бестолковому, как использовать SSP для связи двух LPC213x ? Вроде бы все делаю как надо, а куда-то не туда все уходит :-/. Вам ответить в стиле Вашего вопроса, или попрбуете нормально рассказать что не получается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 2 сентября, 2009 Опубликовано 2 сентября, 2009 (изменено) · Жалоба а не покажете бестолковому, как использовать SSP для связи двух LPC213x ? Вроде бы все делаю как надо, а куда-то не туда все уходит :-/. Сложно? Цепляете SCK,MISO,MOSI одного проца к тем же линиям другого проца. SSEL можно не использовать. Остальное дело программы. В настройках SSP один ессно должен быть мастером, другой слэйвом, а в остальном одинаковые настройки. Режим работы SPI. Земля у процов дожна быть тоже общей. Изменено 2 сентября, 2009 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgen2 0 2 сентября, 2009 Опубликовано 2 сентября, 2009 · Жалоба Вам ответить в стиле Вашего вопроса, или попрбуете нормально рассказать что не получается? Вот это и не получается. В слейве выдает 8 фреймов и все, в мастере и передает, и принимает, даже если кабель на друго проц выдернуть. Принимает исключительно 0xffff, причем только если в jtag-отладчике нажимать F5, если ходить пошагово - приема нет. /* master.c */ #include "LPC230x.h" // Keil: Register definition file for LPC2378 #define MASTER 1 void LPCInit(void); void SSP_Init(int master); static int razs=0; static int razr=0; int mas[256]; int main() { int cmd=0, rcmd=0, par; LPCInit(); #if MASTER SSP_Init(1); #else SSP_Init(0); #endif while(1) { #if MASTER if(SSP0SR & 0x02) //1= TNF Transmit FIFO Not Full. { SSP0DR = cmd; cmd++; razs ++; } if(SSP0SR & 0x04) //1= RNE Receive FIFO Not Empty { rcmd = SSP0DR; mas[razr&0xff] = rcmd; razr++; } #else if(SSP0SR & 0x04) //1= RNE Receive FIFO Not Empty { rcmd = SSP0DR; mas[razr&0xff] = rcmd; razr++; } // if(rcmd != 0) { if(SSP0SR & 0x02) //1= TNF Transmit FIFO Not Full. { cmd = razr; //(rcmd&0xff) | ((razr<<8)& 0xff00); SSP0DR = cmd; razs++; } } #endif } } void SSP_Init(int master) { PCONP |= (1<<21); // power on SSP0 module (default = ON) /* Вариант 0 / PINSEL0 = 0x80000000; // configure P0.15 as SCK0 PINSEL1 = 0x0000002a; // configure P0.16 as SSEL0, 0.17 as MISO0, 0.18 as MOSI0 */ /* Вариант 1 */ PINSEL2 = 0; PINSEL3 = 0x3cf00; //11 1100 1111 0000 0000 /* */ //P1.20 SCK0, P1.21 - SSEL0, P1.23 - MISO0, P1.24 - MOSI0 SSP0CR0 = 0xf; // 16 бит /* SSP0CR0 15:8 SCR Serial Clock Rate. The number of prescaler-output clocks per bit on the bus, minus one. Given that CPSDVR is the prescale divider, and the APB clock PCLK clocks the prescaler, the bit frequency is PCLK / (CPSDVSR x [sCR+1]). */ if(master) { SSP0CPSR = 2; // CPSDVSR Master SSP0CR1 = 0x2; // Enabled, Master mode } else { SSP0CPSR = 12; // CPSDVSR Slave SSP0CR1 = 0x6; // Enabled, Slave mode } } void LPCInit(void) { T1TCR=1; return; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 2 сентября, 2009 Опубликовано 2 сентября, 2009 · Жалоба В слейве выдает 8 фреймов.... Ну, для начала, slave сам никогда ничего сам не выдает. Начинаем с простого - slave передачу master видит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 2 сентября, 2009 Опубликовано 2 сентября, 2009 · Жалоба Вот это и не получается. В слейве выдает 8 фреймов и все, в мастере и передает, и принимает, даже если кабель на друго проц выдернуть.В SPI нет приема или передачи по-отдельности, а только обмен данными. Чтобы что-то принять нужно что-то передать. SPI-слейв не генерит сам тактовый сигнал. Поэтому чтобы мастер принял данные от слейва он должен что-то передавать. Причем передавать данные в таком же количестве в каком он желает принять от слейва. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 2 сентября, 2009 Опубликовано 2 сентября, 2009 (изменено) · Жалоба In Slave mode, the SSP clock rate provided by the master must not exceed 1/12 of the SSP peripheral clock selected in Section 4–7.4. The content of the SSPnCPSR register is not relevant. Вроде это в переводе значит, что SSPnCPSR у слэйва не используется, а у мастера должно быть не ниже 12 (и чётное) в пересчёте на peripheral clock слэйва. Изменено 2 сентября, 2009 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgen2 0 2 сентября, 2009 Опубликовано 2 сентября, 2009 · Жалоба Ну, для начала, slave сам никогда ничего сам не выдает. Начинаем с простого - slave передачу master видит? Поставил и там, и там SSP0CPSR = 12; после чего вроде заработало. Люди с паяльниками утверждали, что должно и так работать. Правда они же и MISO c MOSI перевернули, как в компорте В SPI нет приема или передачи по-отдельности, а только обмен данными. Чтобы что-то принять нужно что-то передать. SPI-слейв не генерит сам тактовый сигнал. Поэтому чтобы мастер принял данные от слейва он должен что-то передавать. Причем передавать данные в таком же количестве в каком он желает принять от слейва. Так на готовности aka RNE и TNF слейв должен смотреть ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgen2 0 3 сентября, 2009 Опубликовано 3 сентября, 2009 · Жалоба процессор LPC2378, в паре планируется LPC214. Обнаружил что FIFO не вполне FIFO. Т.е. посланный фрейм похоже что не уходит сразу, даже если в FIFO ничего не было ( в SSP0SR сидит TFE), а 8 раз прыгает по ступенькам туда и 8 раз обратно... Вот нельзя ли как-нибудь обрезать или укоротить FIFO ? #if MASTER if(SSP0SR & 0x02) //TNF Transmit FIFO Not Full. { SSP0DR = cmd; } if(SSP0SR & 0x04) // RNE Receive FIFO Not Empty { rcmd = SSP0DR; } #else if(SSP0SR & 0x04) //RNE Receive FIFO Not Empty { rcmd = SSP0DR; } if(SSP0SR & 0x02) //TNF Transmit FIFO Not Full. { cmd = rcmd; SSP0DR = cmd; } #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 3 сентября, 2009 Опубликовано 3 сентября, 2009 · Жалоба Т.е. посланный фрейм похоже что не уходит сразу, даже если в FIFO ничего не было ( в SSP0SR сидит TFE), а 8 раз прыгает по ступенькам туда и 8 раз обратно... Посланный фрейм (байт) уходит сразу. В режиме мастера сразу же устанавливается SSPхSR_bit.BSY до конца передачи байта (опустошения всего FIFO). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 4 сентября, 2009 Опубликовано 4 сентября, 2009 · Жалоба а 8 раз прыгает по ступенькам туда и 8 раз обратно... О чем все это??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться