Перейти к содержанию
    

Да, как яуже говорил, если например ставлю брейк межу циклом и между отправкой, то все работает (если SPI2 были бы сконфигурированы не верне, не работало бы вообще!)

 

еще работает тогда, когда я например в дебаггере по очереди пальцем жму на исполнение каждой строки этого кода..

 

а прогоняя весь код не работает! причем проблема именно в этих двух линиях! но какая именно понять не могу?

 

еще вот какой вариант работает:

 

никаких циклов, ничего, ставлю только это: SPI2->DR = d0;

НО! перед этой строкоы ставлю брейк!

 

в дебаггере исполняю, доходит до брейка, и на осциллографе вижу как преже поднятй SCK и нулевой MOSI! Но потом, нажимаю кнопку Run опять, и уже исполняыется вышеописанная команда!И вот вижу свой байт на осциллографе и переключение SCK!

 

А вот если без брейка... т.е. сразу запустить всю прогу! то только вижу приподнятй SCK и нулевой MOSI!

 

 

Это на какие либо мысли толкает? что это может быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покажите код, который получился после того, как Вы применили мой образец. Тот код, который сейчас не работает.

Как Вы понимаете, я из рабочего проекта прислал кусок, в котором проблемы из-за двойной буферизации в STM32 решены.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот по вашему образцу код мой:

 

(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 сказано?так вот если ставлю туда брейкпоинт, дохожу до него и опять стартую то работает! если без брейк поинта, то не работает когда исполняется все сразу!

 

не могу понать почему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня глупый вопрос, а скорости SPI хватает? вы частоту не превысили максимально допустимую?

 

все выглядит каким то чудом.

а вот так если сделать

 

int dummy = SPI2->DR;

SPI2->DR = 0xAA;

while(1);

 

что будет?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подсократили, однако...

Функцию выдачи байта на SPI целиком можно привести?

И как работает без дебаггера? МОжет, где-то статусы изменяются из-за чтения регистра данных дебаггером?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

естесственно хватает, вот что вижу на осциллографе когда работает:

[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!

Изменено пользователем IgorKossak
изображения следует прикреплять к сообщению, а не вставлять

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так... 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.

 

 

ВЫ не дожидаетесь пока байт передастся (когда примется обратно!). Зачем сократили мой код? Там же это было!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все выглядит каким то чудом.

а вот так если сделать

 

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!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раз с глухим while не работает, точно с аппаратным выходом NSS Вам надо разбираться.

Цитату их errata я привёл как пример странных взаимосвязей и как намёк на что смотреть. Правда, при этом не работает совсем. Смотрите на NSS.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не ну тоды магия.

 

А во придумал!!! А если так?

 

while ( (SPI2->SR & SPI_SR_TXE) ==0 );

int dummy = SPI2->DR;

SPI2->DR = 0xAA;

while(1);

 

 

и как проверить что прием окончен?

 

Может у вас вызов идет во время приема потому ничего и не работает? А когда перед записью регистра есть брек поинт, проц успевает что-то принять или передать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробовал добавление SPI_CR1_DFF, тоже самое, не работает если прогонять код сразу.

NSS я не использую! И не используя его но исполняя код по строчкам все работает!

 

Пытатся использовать ег сейчас думаю только усложнит проблему!

 

Ведь ллогически, если сам интерфейс работае в дебаггере когда исполняется по строчкам.. почему он не должен работать когда разом исполняется весь код! вот в чем дело я не думаю чтоэто какое то отношение имеет к NSS.

 

Просто я не могу понять что еще тут может быть?

 

Не ну тоды магия.

 

А во придумал!!! А если так?

 

while ( (SPI2->SR & SPI_SR_TXE) ==0 );

int dummy = SPI2->DR;

SPI2->DR = 0xAA;

while(1);

 

 

и как проверить что прием окончен?

 

Может у вас вызов идет во время приема потому ничего и не работает? А когда перед записью регистра есть брек поинт, проц успевает что-то принять или передать...

 

нет. и так не работает!

 

И нет у меня никакого приема! все просто в тех строчках которые я привел! просто использую пины SCK и MOSI и подключаю их к осциллографу! никакого приема или ччего то еще!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DFF вообще не нужно (этио 16 бит слова).

Вам надо разобраться с SPI_CR1_SSM в Вашей программе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну а что там разбиратся?

у меня и 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 управлять.

 

в моемслучае это вообще не принципиально... т.е. с этим я разобрался и это думаю к данной проблеме не имеет отношения.

Ил я не прав в чем то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а проц то вообще запускается? без дебагера? Может не стартует?

 

ну я бы вот что сделал:

я бы статусные регистры выкидывал бы на порт UART если есть.

До

SPI2->DR = Data;

и после, во время while

 

может чего то оптимизируется?

 

Если нет порта UART то можно на порт GPIO какой то выводить и осциллографом смотреть...

 

но считывать состояние регистра постоянно, и определиться где хоть виснет в рабочем режиме...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

вот как я считываю сейчас регистры: 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

 

есть какие идеи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...