Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 11.11.2015
Сообщений: 12
1

Spi через регистры

19.01.2019, 22:21. Просмотров 963. Ответов 9
Метки нет (Все метки)

пишу в truestudio использую hal

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
* USER CODE BEGIN WHILE */
  while (1)
  {
      HAL_UART_Transmit(&huart1,(uint8_t*)buf, 3, 0xFFFF);
         // HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
          GPIOC->BSRR = GPIO_BSRR_BS13;
          HAL_Delay(500);
          //HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
          GPIOC->BSRR = GPIO_BSRR_BR13;
          HAL_Delay(500);
        
                SPI1->DR = 1;
        while (!(SPI1->SR&SPI_SR_TXE));
 
        //uint8_t b=1;
        // HAL_SPI_Transmit(&hspi1, &b, 1, 0xFFFFFFFF);
  /* USER CODE END WHILE */
поменял вывод в ноги напрямую в регистры - работает.
а вот с выводом в spi что-то не получается. флаг окончания не устанавливается. виснет на строке
while (!(SPI1->SR&SPI_SR_TXE));
если писать как в закомпилированных строках через хал, то работает
где грабли?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2019, 22:21
Ответы с готовыми решениями:

Запуск ацп через регистры
Несколько дней пытаюсь включить АЦП и заставить его передавать данные на ЦАП без ПДП. мк...

Проблемы с fatfs через spi [решено].
Возникала такая проблема с fatfs через spi. Система монтируется, файлы открываются, и даже...

Соединение STM32 + Cubieboard через SPI
Добрый день! Соединяю платы STM32 и Cubieboard2 через SPI. Скорость 10МГц. Может ли длинна...

Вывод информации на TFT через SPI
Всем доброго дня. Помогите с выводом информации на TFT-экран (в моем случае на ILI9341 1,8 дюйма). ...

9
1791 / 1121 / 109
Регистрация: 04.01.2010
Сообщений: 3,952
19.01.2019, 23:56 2
Посмотрите что делает hal. может быть он включает SPI в своей функции, если он все еще не включен и не настроен.
1
0 / 0 / 0
Регистрация: 11.11.2015
Сообщений: 12
20.01.2019, 00:09  [ТС] 3
благодарю. точно.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while (1)
  {
      HAL_UART_Transmit(&huart1,(uint8_t*)buf, 3, 0xFFFF);
         // HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
          GPIOC->BSRR = GPIO_BSRR_BS13;
          HAL_Delay(500);
          //HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
          GPIOC->BSRR = GPIO_BSRR_BR13;
          HAL_Delay(500);
        SPI1->CR1 |= 1<<SPI_CR1_SPE_Pos; //Включаем SPI
        while (!(SPI1->SR&SPI_SR_TXE));
         SPI1->DR = 1;
        while (!(SPI1->SR&SPI_SR_BSY));
 
        //uint8_t b=1;
        // HAL_SPI_Transmit(&hspi1, &b, 1, 0xFFFFFFFF);
  /* USER CODE END WHILE */
 
  /* USER CODE BEGIN 3 */
 
  }
0
6 / 6 / 0
Регистрация: 20.10.2013
Сообщений: 62
22.01.2019, 17:34 4
Цитата Сообщение от MaxAle Посмотреть сообщение
SPI1->CR1 |= 1<<SPI_CR1_SPE_Pos; //Включаем SPI
А почему SPI_CR1_SPE_Pos?

Разве не SPI_CR1_SPE

P.S.
Или тема уже решена?
0
0 / 0 / 0
Регистрация: 11.11.2015
Сообщений: 12
23.01.2019, 01:33  [ТС] 5
я не гуру, только сам взял армовский бубен и по полю с граблями хожу. поясните разницу. и что такое Pos?

Добавлено через 19 минут
.хал как-то мне по душе не пришелся, напоминает ардуино иде, решил армы пощупать, а тут она. не нравиться сие чудо мне.
SPI_CR1- регистр
SPE-бит этого регистра
_Pos?
...попробовал убрать _Pos компиляция проходит, ерора не выскакивает, появляется вонинг

C
1
2
Description Resource    Path    Location    Type
left shift count >= width of type [-Wshift-count-overflow]  main.c  /blink4/Src line 115    C/C++ Problem
спи не запускается. надо в реферес мануал лезть.

Добавлено через 37 минут
в
stm32f103xb.h
определения такие

C
1
2
3
#define SPI_CR1_SPE_Pos                     (6U)                               
#define SPI_CR1_SPE_Msk                     (0x1U << SPI_CR1_SPE_Pos)          /*!< 0x00000040 */
#define SPI_CR1_SPE                         SPI_CR1_SPE_Msk                    /*!< SPI Enable */
поэтому при
SPI1->CR1 |= 1<<SPI_CR1_SPE_Pos
в SPE попадает одын, что включает его
0
Модератор
Эксперт по электронике
8263 / 6123 / 820
Регистрация: 14.02.2011
Сообщений: 21,262
23.01.2019, 06:11 6
Цитата Сообщение от shepard127 Посмотреть сообщение
А почему SPI_CR1_SPE_Pos?
а потому что
Цитата Сообщение от MaxAle Посмотреть сообщение
1<<SPI_CR1_SPE_Pos
_pos означает позиция, 1 сдвинуть на позицию бита
впрочем ТС и сам это нашел
Цитата Сообщение от MaxAle Посмотреть сообщение
.попробовал убрать _Pos компиляция проходит, ерора не выскакивает, появляется вонинг
разумеется на сколько 1 то сдвинуть хочешь
если так нравится работать с битами, то писать нужно
C
1
 SPI1->CR1 |= SPI_CR1_SPE; //Включаем SPI
0
6 / 6 / 0
Регистрация: 20.10.2013
Сообщений: 62
23.01.2019, 09:42 7
Цитата Сообщение от ValeryS Посмотреть сообщение
если так нравится работать с битами, то писать нужно
C
1
SPI1->CR1 |= SPI_CR1_SPE; //Включаем SPI
Ну я как бы, это и имел ввиду сразу
0
0 / 0 / 0
Регистрация: 11.11.2015
Сообщений: 12
24.01.2019, 23:21  [ТС] 8
ОГРОМНОЕ спасибо. дошло

Добавлено через 23 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
если так нравится работать с битами, то писать нужно
C
1
*SPI1->CR1 |= SPI_CR1_SPE;//Включаем SPI

наверно можно, но при компиляции, учитывая вышеприведенные определения в результате все равно получим:

C
1
2
3
4
5
6
#define SPI_CR1_SPE_Pos (6U) 
#define SPI_CR1_SPE_Msk (0x1U << SPI_CR1_SPE_Pos) /*!< 0x00000040 */
#define SPI_CR1_SPE
SPI1->CR1 |=(0x1U << SPI_CR1_SPE_Pos);
а потом
SPI1->CR1 |=(0x1U << (6U));
не будет ли лучше :
C
1
SPI1->CR1 |= SPI_CR1_SPE_Pos;//т.е. SPI1->CR1 |= (6U);
Добавлено через 12 минут
сори не лучше, не пойдет так, туплю

Добавлено через 34 минуты
C
1
SPI1->CR1 |=0x00000040;
а то так
C
1
SPI1->CR1 |=(0x1U << (6U));
он каждый раз высчитывает что есть 0x1U << (6U)
а это тоже время
0
Модератор
Эксперт по электронике
8263 / 6123 / 820
Регистрация: 14.02.2011
Сообщений: 21,262
25.01.2019, 08:04 9
посмотри в ассемблерном листинге, что получится после компиляции в разных случаях
0
0 / 0 / 0
Регистрация: 11.11.2015
Сообщений: 12
25.01.2019, 22:41  [ТС] 10
Цитата Сообщение от ValeryS Посмотреть сообщение
посмотри в ассемблерном листинге, что получится после компиляции в разных случаях
ActionScript 3
1
2
3
4
SPI1->CR1 |=0x00000040;
 8000e3e:   682b        ldr r3, [r5, #0]
 8000e40:   f043 0340   orr.w   r3, r3, #64 ; 0x40
 8000e44:   602b        str r3, [r5, #0]
ActionScript 3
1
2
3
4
SPI1->CR1 |= SPI_CR1_SPE;
 8000e3e:   682b        ldr r3, [r5, #0]
 8000e40:   f043 0340   orr.w   r3, r3, #64 ; 0x40
 8000e44:   602b        str r3, [r5, #0]
благодарю. взял лопату, пытаюсь копать, а где не знаю. спасибо за ответы, становиться понятнее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2019, 22:41

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

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

ILI9341 SPI DMA, SPI, UART библиотеки
Доброго времени, форумчане... Посоветуйте библиотек плиз... 0) Либа для работы с контроллером по...

Функции для работы c SD картой на STM32F030 (F0) через SPI
Прикручиваю SD карту и FatFs к STM32F030F4P6. Проблема совершенно банальная, нужны низкоуровневые...

MSP430G2553 через SPI к CC110L
Есть МК (MSP430G2553) и есть трансмиттер Anaren LR09A на чипе CC110L всё управление чипом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.