0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 42
|
|
1 | |
Управление NSS в SPI01.10.2017, 11:33. Показов 6541. Ответов 24
Метки нет (Все метки)
Доброго времени суток.
У меня такая ситуация : Установка не активного уровня сигнала NSS(CS) ГЛОБАЛЬНО КРИТИЧНО отстает от последнего импульса CLK во фрейме. (на фото видно , синий - NSS(CS)) Управлять им приходится только ручками т.к. на аппаратном уровне этот сигнал ставится в 0 при начале передачи фрейма , а убирается только после уничтожения данного SPI на сколько я понял. Устанавливаю NSS в 0 перед вызовом функции передачи (блокирующей с ожиданием окончания) , а после вызова блокирующей функции в 1. То что получается видно на осциллограмме. Подумал что может немного переделать алгоритм , так же ставлю NSS в 0 но уже перед вызовом не блокирующей функции передачи через DMA , а в 1 из прерывания по случаю окончания передачи , но картина точно такая же! Для той микросхемы флеши в которую мне нужно передать команду , время становления NSS в неактивное состояние после окончания последнего импульса CLK во фрейме очень критично. Может кто сталкивался с подобным и как-то разрешил вопрос ? Процессор STM746ZGT6U https://www.cyberforum.ru/savedimages/2017/10/01/vbwywtmvzw9wxgth.jpg Заранее благодарю за советы.
0
|
01.10.2017, 11:33 | |
Ответы с готовыми решениями:
24
STM32F103C8t6 SPI управление ногой NSS STM32F407 SPI NSS STM32F103CB SPI, Hardware NSS не работает STM32F103 SPI не дрыгает ножкой NSS Управление ЦАПом AD5761 по SPI STM32 |
1 / 1 / 0
Регистрация: 28.12.2015
Сообщений: 63
|
|
10.10.2017, 21:58 | 21 |
А так тоже не работает?
Код
while (hspi->State != HAL_SPI_STATE_READY) { } HAL_GPIO_WritePin(CLATCH_PORT, CLATCH_PIN, GPIO_PIN_RESIT); HAL_SPI_Transmit_DMA(hspi, (uint8_t*) (&Data), sizeof(Data)); while (hspi->State != HAL_SPI_STATE_READY) { } HAL_GPIO_WritePin(CLATCH_PORT, CLATCH_PIN, GPIO_PIN_SIT);
0
|
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 42
|
|
10.10.2017, 23:38 | 22 |
так слишком много времени тратится , и микросхема игнорит комманду EROSE (другие комнады работают , но без EROSE никуда)
для таких флешей QUAD SPI подходит , там аппаратно все прекрасно работает, т.к. у меня устройство и снифер и программер это не очень удобно т.к. приходится объеденять ножки и налету переконфигурировать их и переферию. Но вот нужно чтобы переменные(структуры) созданные на стеке были кратные 0x10 , либо придется использовать глобальные переменные , они запросто выравниваются на 0x10 , но это не красиво. как сделать чтобы компилятор создавал на стеке переменную с адреса кратного 0x10 я пока не разобрался.
0
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
|
11.10.2017, 00:05 | 23 |
Сообщение от ZiroSotd
можно попробовать создать метку по фиксированному адресу в памяти с помощью ассемблера. Другими словами, объявить переменную прямо в коде асмовского стартапа. Из кода на С/С++ эту переменную можно получить объявив ее как внешнюю. Только надо помнить о том, что в асме она должна именоваться с подчеркивания (а в коде на С/С++ - без подчеркивания) и если код на плюсах, то в объявлении переменрой нужно не забыть extern "C".
0
|
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 42
|
|
11.10.2017, 09:39 | 24 |
Вариант , но хардкодить не хочется , на глобал скопе объявить переменную , и адаптировать код под нее , думаю гибче будит выглядеть , сейчас так и делаю.
посже конечно вернусь к теме выравнивания стека до кратности 16 при создании локальной переменной.
0
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
|
11.10.2017, 12:40 | 25 |
Сообщение от ZiroSotd
Код
void fn() { unsykned char* buf = alloca(sizeof(MyStruct) + 16); MyStruct* my_struct = (MyStruct*)(((unsykned long) buf + 15) & ~0x0F); }
0
|
11.10.2017, 12:40 | |
11.10.2017, 12:40 | |
Помогаю со студенческими работами здесь
25
STM32F103C8 hardware NSS в SPI2 ILI9341 SPI DMA, SPI, UART библиотеки Управление потенциометров по SPI из AtMega16 управление матрицой светодиодов и странный SPI Управление по SPI цифровым потенциометром AD5206BN10 FireFox и nss Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |