Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35

Наконец-то (!) у меня не работает SPI на STM32+ADS1294 и я не хочу читать RM)

04.02.2020, 14:36. Показов 1211. Ответов 3

Студворк — интернет-сервис помощи студентам
Дратути.
Пытаюсь связаться с АЦП ADS1294 через SPI STM32F105 и терплю фиаско. Разводка точно верная.
http://www.ti.com/lit/ds/symlink/ads1296.pdf
Это мой первый опыт с SPI, программер я тот еще, так что косяк явно в коде, но я уже голову сломала, где именно. Приходит ноль, даже из регистров, которые я до этого переписывала. На двух платах. Помогите, люди добрые.
И да, у меня HAL для задержек, итак сойдет)


Это ини для GPIO и SPI
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void SPI_ini(void)
{
    RCC->APB2ENR |=  RCC_APB2ENR_AFIOEN;     //включить тактирование альтернативных функций
    RCC->APB2ENR |=  RCC_APB2ENR_IOPAEN;     //включить тактирование порта А
    //вывод управления CS: выход двухтактный, общего назначения, 50MHz max
    GPIOC->CRH   |=  GPIO_CRH_MODE9;    //
    GPIOC->CRH   &= ~GPIO_CRH_CNF9;     //
    GPIOC->BSRR   =  GPIO_BSRR_BS9;     //
 
    //вывод SCK: выход двухтактный, альтернативная функция, 50MHz max
    GPIOA->CRL   |=  GPIO_CRL_MODE5;    //
    GPIOA->CRL   &= ~GPIO_CRL_CNF5;     //
    GPIOA->CRL   |=  GPIO_CRL_CNF5_1;   //
 
    //вывод MISO: вход цифровой с подтягивающим резистором, подтяжка к плюсу
    GPIOA->CRL   &= ~GPIO_CRL_MODE6;    //
    GPIOA->CRL   &= ~GPIO_CRL_CNF6;     //
    GPIOA->CRL   |=  GPIO_CRL_CNF6_1;   //
    GPIOA->BSRR   =  GPIO_BSRR_BS6;     //
 
    //вывод MOSI: выход двухтактный, альтернативная функция, 50MHz max
    GPIOA->CRL   |=  GPIO_CRL_MODE7;    //
    GPIOA->CRL   &= ~GPIO_CRL_CNF7;     //
    GPIOA->CRL   |=  GPIO_CRL_CNF7_1;   //
 
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //подать тактирование
    SPI1->CR1     = 0x0000;             //очистить первый управляющий регистр
    SPI1->CR2     = 0x0000;             //очистить второй управляющий регистр
    SPI1->CR1    |= SPI_CR1_MSTR;       //контроллер должен быть мастером
    SPI1->CR1    |= SPI_CR1_BR_0;         //задаем скорость
    SPI1->CR1    |= SPI_CR1_SSI;        //обеспечить высокий уровень программного NSS
    SPI1->CR1    |= SPI_CR1_SSM;        //разрешить программное формирование NSS
    SPI1->CR1    |= SPI_CR1_SPE;        //разрешить работу модуля SPI
    SPI1->CR1    |= SPI_CR1_CPHA;    //1
}

Это функция отправки-чтения
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
uint8_t UsSPI1_Exchange (uint8_t _data)
{
    while (!(SPI1->SR & SPI_SR_TXE)); //не комментировать)
    SPI1->DR=_data;
    while (!(SPI1->SR & SPI_SR_RXNE));
    rdata=SPI1->DR;
    return rdata;
}

Это отправонька настроек в нужные регистры АЦП
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
static const uint8_t ADS129x_8CH_SETUP[] =
{
    0xA3,           // CONFIG_1
    0x02,           // CONFIG_2
    0xE8,           // CONFIG_3     
    0x00,           // LOFF
    0x60,           // ch 1
    0x60,           // ch 2
    0x60,           // ch 3
    0x60,           // ch 4
    0x60,           // ch 5
    0x60,           // ch 6
    0x60,           // ch 7
    0x60,           // ch 8
    0x00,           // RLD_SENSP
    0x00,           // RLDSENS_L
};
 
void ADC_Config(void)
{
    const uint8_t* setup = ADS129x_8CH_SETUP;
    uint16_t    count = sizeof(ADS129x_8CH_SETUP);
    ADS129x_CS_ON();
    UsSPI1_Exchange(ADS129x_WREG + 0x01); //command to write to CONFIG1+
        HAL_Delay(10);
 
        UsSPI1_Exchange(count);
        HAL_Delay(10);
 
        while(count--)
        {
            HAL_Delay(10);
            UsSPI1_Exchange(*setup++);
        }
 
        HAL_Delay(100);
    ADS129x_CS_OFF();
}

А это попытка прочесть ID или какой-то регистр настроек, которйы я до этого записала
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
 while (1)
  {
 
      ADS129x_CS_ON();
      UsSPI1_Exchange(ADS129x_RREG + 0x01);
      HAL_Delay(10);
      UsSPI1_Exchange(0x02);
      HAL_Delay(10);
      id = UsSPI1_Exchange(0x00);
      HAL_Delay(10);
      id = UsSPI1_Exchange(0x00);
      HAL_Delay(10);
      ADS129x_CS_OFF();
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2020, 14:36
Ответы с готовыми решениями:

У меня наконец вырас PR до 3
Вот отдал 30000 руб заа поднятия сайта в 3х поисковиках. Написали мне статьи и пошаманили на сайте и наконец то вырос PR. Но для меня...

STM32 + SPI
Собственно, проблема. Мой нижеприведенный код, по идее, должен изменять настройки SPI и включать его. Но когда я прохожу программу...


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

Или воспользуйтесь поиском по форуму:
3
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
04.02.2020, 20:37
Цитата Сообщение от ouchouch Посмотреть сообщение
Это функция отправки-чтения
ну и как вызывается эта функция?
где дергается ножка CS(NSS)?
0
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
11.02.2020, 17:14  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
ну и как вызывается эта функция?
? Вручную)

Цитата Сообщение от ValeryS Посмотреть сообщение
где дергается ножка CS(NSS)?
Везде, предварительно перед тем как вызвать функцию отправки-чтения.
см. ADS129x_CS_ON();
Например, в "Это отправонька настроек в нужные регистры АЦП"
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
17.02.2020, 00:33
C
1
SPI1->CR1    |= SPI_CR1_BR_0;         //задаем скорость
и какая скорость у вас получилась?
PS: В STM32F1x SPI работает до 18МГц максимум. Выше клок настраивается, но не работает. (Ну, ладно-ладно, на столе может и 25МГц завестить, но это не надежно)

И еще - а где ваши попытки чтения статуса? Вы пробовали, допустим, отправить команду WAKEUP и подождать?
Вам вместо конфигурирования следовало бы вообще - получить связь с АЦП сначала. Если статус он не возвращает - то связи и не будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru