Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 SPI в HAL прыгает CS
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Pasa
Всем доброго времени суток.

1.
Недавно решил освоить STM32(STM32F051). Нужно управлять через SPI девайсом CC2500.
Девайс требует одного CS на несколько байт . В библиотеке HAL функции приема передачи после каждого байта снимают CS. Пришлось CS ставить на программное ручное управление.
Можно как-то заставить HAL не дергать CS для передачи паравоза из нескольких байт?

2.
И еще...такой вопрос неопытного....
В IAR прошиваю контроллер через Jetlink, запускаю отладку - программа крутиться.
А если отсоединить Jetlink и просто подать питание на контрлллер, то ничего не запускается....
Как прошить из IAR программу в контроллер чтобы она там сама крутилась после подачи питания без всяких внешних подключений?

Lagman
Цитата(Pasa @ Jul 14 2016, 22:56) *
Можно как-то заставить HAL не дергать CS для передачи паравоза из нескольких байт?

А какой командой вы записываете паровоз байт?
Pasa
Цитата(Lagman @ Jul 15 2016, 00:09) *
А какой командой вы записываете паровоз байт?

HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)&tx_byte[0], (uint8_t*)&rx_byte[0], 2, 10000)
nanorobot
Цитата(Pasa @ Jul 15 2016, 00:56) *
Всем доброго времени суток.

1.
Недавно решил освоить STM32(STM32F051). Нужно управлять через SPI девайсом CC2500.
Девайс требует одного CS на несколько байт . В библиотеке HAL функции приема передачи после каждого байта снимают CS. Пришлось CS ставить на программное ручное управление.
Можно как-то заставить HAL не дергать CS для передачи паравоза из нескольких байт?


регистр SPIx_CR2 битик NSSP взведите
Pasa
Цитата(nanorobot @ Jul 15 2016, 13:12) *
регистр SPIx_CR2 битик NSSP взведите


Так это само в HAL-библиотеке делается.

В СubeMX при ините hspi в файле spi.c :

hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; //(SPI_NSS_HARD_OUTPUT = 0x0004 0000;)

И уже на нижнем уровне в stm32f0xx_hal_spi.c прописывается в CR2 бит SSOE(ну или вы назвали его NSSP):

hspi->Instance->CR2 = (((hspi->Init.NSS >> 16) & SPI_CR2_SSOE) | hspi->Init.TIMode | hspi->Init.NSSPMode | hspi->Init.DataSize ) | frxth; //(SPI_CR2_SSOE = 4)

...но все равно попробовал руками ставить в CR2 бит 0x04......как и ожидал.....все равно CS скачет
nanorobot
Цитата(Pasa @ Jul 16 2016, 00:08) *
Так это само в HAL-библиотеке делается.

В СubeMX при ините hspi в файле spi.c :

hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; //(SPI_NSS_HARD_OUTPUT = 0x0004 0000;)

И уже на нижнем уровне в stm32f0xx_hal_spi.c прописывается в CR2 бит SSOE(ну или вы назвали его NSSP):

hspi->Instance->CR2 = (((hspi->Init.NSS >> 16) & SPI_CR2_SSOE) | hspi->Init.TIMode | hspi->Init.NSSPMode | hspi->Init.DataSize ) | frxth; //(SPI_CR2_SSOE = 4)

...но все равно попробовал руками ставить в CR2 бит 0x04......как и ожидал.....все равно CS скачет



NSSP и SSOE разные вещи, и если склероз мне не изменяет обе должны быть в 1. С кубом дела не имел, делал либо ручками, либо пользовал HAL из состава ChibiOS.
родные же СТМовские либы рядом с ним полное Г. (во всяком случае FWLibrary) думаю что и куб недалеко ушел.

Кстати я всегда использую SPI в связке с DMA. В этом случве работает именно так, как Вам надо. Возможно что только в этом случае, по другому использовать SPI / STM32 не приходилось. Еще могу добавить что такая фича SPI имеется на STM43F0x, и STM32F37x/ А вот STM32F40x, F41x, F20x, ее нет. Про более новые не в курсе
Pasa


Цитата(nanorobot @ Jul 16 2016, 01:06) *
NSSP и SSOE разные вещи


в CR2 я просто других битов относящихся к аппаратной поддержке не нашел...и в него попадает именно бит,обозванный в HAL как SSOE( я выше кодом взятым из HAL описал как это реализовано)

В HAL для аппаратная поддержка реализуетсявот так :
hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;

Собственно только ими и можно игратья. Кубом они ставятся....но похоже что эффект получается именно из-за аппаратной реализации .

1113
Цитата(nanorobot @ Jul 15 2016, 12:42) *
регистр SPIx_CR2 битик NSSP взведите

разве всё с точностью не наоборот?

Цитата
27.5.11 NSS pulse mode
This mode is activated by the NSSP bit in the SPIx_CR2 register and it takes effect only if the SPI interface is configured as Motorola SPI master (FRF=0) with capture on the first edge (SPIx_CR1 CPHA = 0, CPOL setting is ignored). When activated, an NSS pulse is generated between two consecutive data frame transfers when NSS stays at high level for the duration of one clock period at least. This mode allows the slave to latch data. NSSP pulse mode is designed for applications with a single master-slave pair.

Цитата
Bit 3 NSSP: NSS pulse management
This bit is used in master mode only. it allow the SPI to generate an NSS pulse between two consecutive data when doing continuous transfers. In the case of a single data transfer, it forces the NSS pin high level after the transfer. It has no meaning if CPHA = ’1’, or FRF = ’1’.

0: No NSS pulse
1: NSS pulse generated

Note:
1. This bit must be written only when the SPI is disabled (SPE=0).
2. This bit is not used in I2S mode and SPI TI mode.
nanorobot
Цитата(1113 @ Jul 16 2016, 13:33) *
разве всё с точностью не наоборот?


нет не наоборот, проверено практикой. Возможно я не помню некоторых нюансов, но четко помню что для меня, в свое время, это было весьма приятным сюрпризом, и обусловило в дальнейшем выбор чипов с ткой фичей. Только что сделал checkout проекта, где использовал эту фичу: NSSP = 1 Помню что без него имел одну из двух:
1. NSS = 0 в течении всего времени пока SPI разрешен (SPE = 1) кажется SSOE = 1 при этом
2. NSS уходил в ноль перед началом передачи и возвращался в 1 после окончания передачи каждого байта.

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


вообще то Вы заронили в меня сомнения... память вещь ненадежная. Три года прошло с тех пор. Короче отзываю свою стопудовую уверенность, но пост не стираю


да похоже Вы правы, Это просто для импульсного режима, что б не все время в нуле. А для группы байт вначале вручную сбрасывал НСС а после окончания ДМА - прерывание, и в нем устнавливал снова вручную. Сорри.
Pasa
выходит, что избавится от "прыгания" CS на каждом байте в аппаратной реализации нельзя....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.