BlackOps 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба Да, как яуже говорил, если например ставлю брейк межу циклом и между отправкой, то все работает (если SPI2 были бы сконфигурированы не верне, не работало бы вообще!) еще работает тогда, когда я например в дебаггере по очереди пальцем жму на исполнение каждой строки этого кода.. а прогоняя весь код не работает! причем проблема именно в этих двух линиях! но какая именно понять не могу? еще вот какой вариант работает: никаких циклов, ничего, ставлю только это: SPI2->DR = d0; НО! перед этой строкоы ставлю брейк! в дебаггере исполняю, доходит до брейка, и на осциллографе вижу как преже поднятй SCK и нулевой MOSI! Но потом, нажимаю кнопку Run опять, и уже исполняыется вышеописанная команда!И вот вижу свой байт на осциллографе и переключение SCK! А вот если без брейка... т.е. сразу запустить всю прогу! то только вижу приподнятй SCK и нулевой MOSI! Это на какие либо мысли толкает? что это может быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба Покажите код, который получился после того, как Вы применили мой образец. Тот код, который сейчас не работает. Как Вы понимаете, я из рабочего проекта прислал кусок, в котором проблемы из-за двойной буферизации в STM32 решены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба вот по вашему образцу код мой: (void) SPI2->DR; /* clear SPI_SR_RXNE in status register */ // breakpoint here! SPI2->DR = (d0 & SPI_DR_DR); while ((SPI2->SR & SPI_SR_TXE) == 0) ; Видите коммент где про breakpoint сказано?так вот если ставлю туда брейкпоинт, дохожу до него и опять стартую то работает! если без брейк поинта, то не работает когда исполняется все сразу! не могу понать почему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба у меня глупый вопрос, а скорости SPI хватает? вы частоту не превысили максимально допустимую? все выглядит каким то чудом. а вот так если сделать int dummy = SPI2->DR; SPI2->DR = 0xAA; while(1); что будет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба Подсократили, однако... Функцию выдачи байта на SPI целиком можно привести? И как работает без дебаггера? МОжет, где-то статусы изменяются из-за чтения регистра данных дебаггером? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 (изменено) · Жалоба естесственно хватает, вот что вижу на осциллографе когда работает: [DELETED] а вот когда не работает: [DELETED] чтото пост большой какойто стал :Р без дебаггера тоже не работает! т.е. если на чип заливаю, и включаю, то не работает! Никакой функции нету! исполняю прямо кодом для простоты! вот один из кодов привожу еще раз, где в комменте указано если там стоит брейк то работает, если нет брейка то не работает. (void) SPI2->DR; /* clear SPI_SR_RXNE in status register */ // breakpoint here! SPI2->DR = (d0 & SPI_DR_DR); while ((SPI2->SR & SPI_SR_TXE) == 0) ; да! я знаю! проблема сократилась! но дело в том что непонятно в чем сейчас дело... все просто...убираю брейк не работает если прогорняыется код сразу! ставлю брейк вижу сначала изображение №2 в посте, потом вновь запускаю как только достиг брейка, и вижу изображение №1 (т.е. рабочее) а если нет брейка, т.е. сразу прогоняыется весь код, то тока изображение №2! Изменено 22 апреля, 2013 пользователем IgorKossak изображения следует прикреплять к сообщению, а не вставлять Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба Так... 1) А что с выходом чипселекта? Сказать что есть и не подкдючаться к нему: const uint_fast32_t cr1bits = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SPE | baudrate; const uint_fast32_t cr1bits16w = cr1bits | SPI_CR1_DFF; 0) У STM32F1xxx есть errata: // Silicon errata: // 2.6.7 I2C1 with SPI1 remapped and used in master mode // Workaround: // When using SPI1 remapped, the I2C1 clock must be disabled. ВЫ не дожидаетесь пока байт передастся (когда примется обратно!). Зачем сократили мой код? Там же это было! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба все выглядит каким то чудом. а вот так если сделать int dummy = SPI2->DR; SPI2->DR = 0xAA; while(1); что будет? ничего не будет, тоже не работает! а вот если ставлю брейк на линии int dummy = SPI2->DR; исполняю код, дохожу до брейка, затем опять исполняют, то работает! не могу понять в чем дело! Так... 1) А что с выходом чипселекта? Сказать что есть и не подкдючаться к нему: const uint_fast32_t cr1bits = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SPE | baudrate; const uint_fast32_t cr1bits16w = cr1bits | SPI_CR1_DFF; 0) У STM32F1xxx есть errata: // Silicon errata: // 2.6.7 I2C1 with SPI1 remapped and used in master mode // Workaround: // When using SPI1 remapped, the I2C1 clock must be disabled. ВЫ не дожидаетесь пока байт передастся (когда примется обратно!). Зачем сократили мой код? Там же это было! да но ведь я же использую SPI2 а не SPI1! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 апреля, 2013 Опубликовано 21 апреля, 2013 (изменено) · Жалоба Раз с глухим while не работает, точно с аппаратным выходом NSS Вам надо разбираться. Цитату их errata я привёл как пример странных взаимосвязей и как намёк на что смотреть. Правда, при этом не работает совсем. Смотрите на NSS. Изменено 21 апреля, 2013 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба Не ну тоды магия. А во придумал!!! А если так? while ( (SPI2->SR & SPI_SR_TXE) ==0 ); int dummy = SPI2->DR; SPI2->DR = 0xAA; while(1); и как проверить что прием окончен? Может у вас вызов идет во время приема потому ничего и не работает? А когда перед записью регистра есть брек поинт, проц успевает что-то принять или передать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба попробовал добавление SPI_CR1_DFF, тоже самое, не работает если прогонять код сразу. NSS я не использую! И не используя его но исполняя код по строчкам все работает! Пытатся использовать ег сейчас думаю только усложнит проблему! Ведь ллогически, если сам интерфейс работае в дебаггере когда исполняется по строчкам.. почему он не должен работать когда разом исполняется весь код! вот в чем дело я не думаю чтоэто какое то отношение имеет к NSS. Просто я не могу понять что еще тут может быть? Не ну тоды магия. А во придумал!!! А если так? while ( (SPI2->SR & SPI_SR_TXE) ==0 ); int dummy = SPI2->DR; SPI2->DR = 0xAA; while(1); и как проверить что прием окончен? Может у вас вызов идет во время приема потому ничего и не работает? А когда перед записью регистра есть брек поинт, проц успевает что-то принять или передать... нет. и так не работает! И нет у меня никакого приема! все просто в тех строчках которые я привел! просто использую пины SCK и MOSI и подключаю их к осциллографу! никакого приема или ччего то еще! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба DFF вообще не нужно (этио 16 бит слова). Вам надо разобраться с SPI_CR1_SSM в Вашей программе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба Ну а что там разбиратся? у меня и SSM=1 и SSI = 1 Когда SSM=1 то програмное управление слейвом включено. в таком случае значение бита SSI передается на ногу NSS, и то что на ноге NSS извне игнорируется! Bit 8SSI:Internal slave select This bit has an effect only when the SSM bit isset. The value of this bit is forced onto the NSS pin and the IO value of the NSS pin is ignored. иными словами этим битом можно ногой NSS управлять. в моемслучае это вообще не принципиально... т.е. с этим я разобрался и это думаю к данной проблеме не имеет отношения. Ил я не прав в чем то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба а проц то вообще запускается? без дебагера? Может не стартует? ну я бы вот что сделал: я бы статусные регистры выкидывал бы на порт UART если есть. До SPI2->DR = Data; и после, во время while может чего то оптимизируется? Если нет порта UART то можно на порт GPIO какой то выводить и осциллографом смотреть... но считывать состояние регистра постоянно, и определиться где хоть виснет в рабочем режиме... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба проц нормально запускается и работает без дебаггера, т.к. я другие рабочие куски вставлял в программу перед своим тестовым кодом. вот как я считываю сейчас регистры: SR,CR1,CR2 кодом своим: while ( (SPI2->SR & SPI_SR_TXE) ==0 ); sr_t = SPI2->SR; cr1_t = SPI2->CR1; cr2_t = SPI2->CR2; // breakpoint here! SPI2->DR = 0xAA; и вот что вижу в дебаггере, все вроде нормально CR1=б1101010111 (SSM=1,SSI=1,SPE=1,BR=010,MSTR=1,CPOL=1,CPHA=1) SR=0х2 (т.е. только ТХЕ=1) CR2=0 сделал так как Вы предлагли через USART тоже. вот код: while ( (SPI2->SR & SPI_SR_TXE) ==0 ) { while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set } while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set SPI2->DR = d0; в USART увидел только два полученных байта: 00 02 что говорит о том что, то что внутри while цикла не выполнилось, т.к. ТХЕбыл уже равен 1 (т.е. буфер отправки данных изначально ыл свободен) А затем я получилдва байта 00 02, перед SPI2->DR = d0; как Вы и предлагали изначение 02 говорит что ТХЕ по пренему равен 1, т.е. буфер свободен. но не работает это! на осцилографе вижу подтянутый ввех SCK и нулевой MOSI есть какие идеи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться