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

STM32F4Discovery SPI, сигнал CS

Делитель (1/8) работает с клоками APB1. А есть еще делитель самих клоков APB1 относительно клоков проца (APB1_Prescaler), его тоже нужно знать.

 

А макисмальная частота APB1 - 30 Мгц, т.е. делитель - не менее 1/8. В результате общее деление, скорее всего, равно 1/64. Но это данные для Stm32F207, для F4 частота APB1 может и отличаться.

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


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

Если уж исследовать, то не грех подтянуть частоту SPI к частоте ядра. Положим, ядро "затормозим", APB1_Prescaler=1 и fPCLK=4; вход\выход из подпрограмм занимает (нормально занимает) что-то, вот и будет видно как флаги в SPI успевают\не успевают к опросу. Надеюсь TS под JTAGом отлаживается?

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

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


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

Как вы выходите из положения?

Мы в такое положение не попадаем, так как всегда работаем с SPI через DMA или хотя-бы посредством прерываний. ;)

Чего и Вам советуем.

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


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

Друзья, не могу понять в чем дело.

На эту тему уже было большое обсуждение.

Вкратце вывод таков: надо ждать RXNE, и потом ещё несколько тактов, в зависимости от скорости и режима SPI.

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


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

Ладно, с этм разберусь когда железяку запущу хоть как-то. Идея в целом понятна. По результатам дам знать. Спасибо за разжевывание )))

 

Пока что возник следующий проблем:

Что-то записываю в слейв, потом пытаюсь прочитать и... не вижу клока для чтения.

void mcp_read(uint8_t addr) {
    GPIO_ResetBits(GPIOB, GPIO_Pin_11);
    spi2_send(0x41);
    spi2_send(addr);
    SPI_I2S_ReceiveData(SPI2);
    GPIO_SetBits(GPIOB, GPIO_Pin_11);
}

...

mcp_write(0x05, 0x20); // IOCON
mcp_write(0x00, 0x00); // IODIR
mcp_write(0x01, 0xA5); // IPOL
mcp_read(0x01); // IPOL

 

Я вижу что слейв что-то пытается выдать на свой SDO, но т.к. нет клока, то слейв обламывается и мой мастер ничего не принимает... Что за очередной бред? (Мы щас пока не трогаем всякие прерывания и прочие DMA).

Соответственно, никакие прерывания не дергаются.

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

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


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

Потому что StdLib - ад и ужас.

 

Клок на шине выставляет мастер. Чтобы он это сделал, ему надо сказать "передавай". Этот StdLib так не делает, хотя, если судить только по названиям функций, должен.

Т.е. берём и делаем ОДНУ функцию

    uint8_t Rw(uint8_t out = 0xFF)
    {
        SPIx->DR = out;
        while (!(SPIx->SR & SPI_SR_RXNE));
        return SPIx->DR;
    }

(украдено из Stm32tpl авторства AHTOXA)

и вызываем (сиплюсплюс):

 

mcp.Active ();
mcp.Rw (0x41);
mcp.Rw (addr);
uint8_t res = mcp.Rw ();
mcp.Deactive ();
return res;

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


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

Потому что StdLib - ад и ужас.

 

Клок на шине выставляет мастер. Чтобы он это сделал, ему надо сказать "передавай". Этот StdLib так не делает, хотя, если судить только по названиям функций, должен.

Т.е. берём и делаем ОДНУ функцию

 

Т.е., чтобы что-то прочитать - надо что-то записать. Люююто. А как быть, если нужно прочитать много байт, а слейв не допускает dummy-записей? Ну, то есть, во время записи dummy-слов слейв может на них как-то отреагировать, т.к. для него это будут команды какие-нибудь.

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


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

Ну тут надо немного подумать.

Как слейв узнает пишите вы или нет:)? Клоки то чтобы данные забрать все равно идут:))))) Это же не РС232 где есть факт начала записи. Смотрите описание, там написано в каком состоянии нога должна быть

в 1 шлите FF, в 0 шлите 00, скорее всего там будет в состоянии пофиг....

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


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

"А как быть, если нужно прочитать много байт, а слейв не допускает dummy-записей?"

 

Тогда это не SPI: SCK тактируют одновременно и MOSI и MISO.

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


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

ilkz, попробуете замедлить ядро чтобы SPI успевал обновлять флаги к опросу?
Изменено пользователем Obam

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


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

Вкратце вывод таков: надо ждать RXNE, и потом ещё несколько тактов, в зависимости от скорости и режима SPI.

Жесть какая.... :wacko:

Вот ответ на вопрос, почему я в своих проектах стараюсь не использовать STM32....

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


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

Напоминаю, что дождавшись RXNE надо обязательно прочитать DR, нужен он Вам или нет... И дуло исчезнет... И жести не будет.

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

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


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

Напоминаю, что дождавшись RXNE надо обязательно прочитать DR, нужен он Вам или нет... И дуло исчезнет... И жести не будет.

Думаете всё-таки рискнуть и применить в следующей (как раз намечающейся) разработке STM32? :rolleyes:

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


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

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

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

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

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

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

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

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

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

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