реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103R8 неправильные значений в DR регистре модуля SPI
georgfour
сообщение May 4 2016, 18:02
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Добрый день.
В IAR отлаживаю микроконтроллер STM32F103R8.
При записи числа, например 0x0000 в регистр DR в реальном регистре значение равно 0xE000 (привожу скриншот для этого случая).
При записи, например, 0x00FE реальное значение регистра равно 0xC0FF. Ну и тому подобное.
В чем может быть проблема?
Сам код:
CODE
#include "stm32f10x.h"

void init_clock(void)
{
RCC->APB2ENR|=RCC_APB2ENR_IOPBEN;
RCC->APB1ENR|=RCC_APB1ENR_SPI2EN;
}

void init_gpio(void)
{
GPIOB->CRH|=(GPIO_CRH_CNF13_1|GPIO_CRH_MODE13_0|GPIO_CRH_MODE13_1);
GPIOB->CRH&=~GPIO_CRH_CNF13_0;//set PA5(SCK) pin for SPI2
GPIOB->CRH|=(GPIO_CRH_CNF15_1|GPIO_CRH_MODE15_0|GPIO_CRH_MODE15_1);
GPIOB->CRH&=~GPIO_CRH_CNF15_0;//set PA7(MOSI) pin for SPI2
GPIOB->CRH|=(GPIO_CRH_MODE12_0|GPIO_CRH_MODE12_1);
GPIOB->CRH&=~(GPIO_CRH_CNF12_0|GPIO_CRH_CNF12_1);//set PA4(NSS) pin for SPI2 in software mode
}

void init_spi1(void)
{
SPI2->CR1|=(SPI_CR1_BR_0|SPI_CR1_BR_1);//set baud rate Fpclk/16
SPI2->CR1|=SPI_CR1_CPOL;//set polarity
SPI2->CR1|=SPI_CR1_DFF;//set 16-bit frame format
SPI2->CR1&=~SPI_CR1_LSBFIRST;//set MSBFIRST frame format
SPI2->CR1|=SPI_CR1_SSM;//set software NSS pin management
SPI2->CR1|=SPI_CR1_SSI;//set NSS bit
SPI2->CR1|=SPI_CR1_MSTR;//set MASTER mode
SPI2->CR1|=SPI_CR1_SPE;//enable SPI
}

void set_dac1(int voltage)
{
GPIOB->BSRR|=GPIO_BSRR_BS12;
SPI2->DR=((uint16_t)voltage);
if ((SPI2->SR) & SPI_SR_TXE)
{
GPIOB->BRR|=GPIO_BSRR_BS12;
}
}

int main(void)
{
init_clock();
init_gpio();
init_spi1();
while(1)
{
//set_dac1(0x01FF);
GPIOB->BSRR|=GPIO_BSRR_BS12;
SPI2->DR=0xE;
if ((SPI2->SR) & SPI_SR_TXE)
{
GPIOB->BRR|=GPIO_BSRR_BS12;
}
}

}


Сообщение отредактировал IgorKossak - May 5 2016, 08:16
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!

Прикрепленные изображения
Прикрепленное изображение Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
nanorobot
сообщение May 4 2016, 18:23
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(georgfour @ May 5 2016, 00:02) *
Добрый день.
В IAR отлаживаю микроконтроллер STM32F103R8.
При записи числа, например 0x0000 в регистр DR в реальном регистре значение равно 0xE000 (привожу скриншот для этого случая).
При записи, например, 0x00FE реальное значение регистра равно 0xC0FF. Ну и тому подобное.

}[/code]

Не очень понятно - это Вы на стороне приемника(слейва) смотрите? Или здесь же на стороне мастера. Если на стороне мастера, то видимо Вы не поняли принципа работы SPI интерфейса. Чтение и запись обращаются к РАЗНЫМ физическм регистрам При чтении регистра DR Вы читаете ПРИНЯТЫЕ данные. Похоже Вы работаете с SPI ЦАП. Каой ЦАП используете? Как вы наблюдаете что туда пришло?

Цитата(nanorobot @ May 5 2016, 00:21) *
Не очень понятно - это Вы на стороне приемника(слейва) смотрите? Или здесь же на стороне мастера. Если на стороне мастера, то видимо Вы не поняли принципа работы SPI интерфейса. Чтение и запись обращаются к РАЗНЫМ физическм регистрам При чтении регистра DR Вы читаете ПРИНЯТЫЕ данные. Похоже Вы работаете с SPI ЦАП. Каой ЦАП используете? Как вы наблюдаете что туда пришло?



Не сразу картинку увидел. Так и есть вы смотрите на то , на что смотреть не следует ))) см. выше.

Сообщение отредактировал nanorobot - May 4 2016, 18:21
Go to the top of the page
 
+Quote Post
georgfour
сообщение May 4 2016, 18:27
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Я смотрю со стороный мастера - мастер это контроллер, он шлет данные в ЦАП.
ЦАП AD7391 - на осциллографе наблюдаю все что приходит. На его выходе почему то все значения умноженные на два, то есть если посылаю 255 наблюдаю около 0.6 вольт (референс 1.2 вольта).
Я полагаю что это как раз из-за того что что-то непонятное посылается из DR.
И почему я не туда смотрю? То я что посылаю в DR должно отправляться мастером приемнику.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение May 4 2016, 18:32
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



если у вас ЦАП то вероятнее всего MISO не используется совсем, и то что вы читаете в регистре DR может быть следствием наводок на неподтянутую ногу MISO

Цитата(georgfour @ May 5 2016, 00:27) *
Я смотрю со стороный мастера - мастер это контроллер, он шлет данные в ЦАП.
ЦАП AD7391 - на осциллографе наблюдаю все что приходит. На его выходе почему то все значения умноженные на два, то есть если посылаю 255 наблюдаю около 0.6 вольт (референс 1.2 вольта).
Я полагаю что это как раз из-за того что что-то непонятное посылается из DR.
И почему я не туда смотрю? То я что посылаю в DR должно отправляться мастером приемнику.

оно и отпрвляется, при ЗАПИСИ в DR, а при ЧТЕНИИ(в том числе и отладчиком) вы наблюдаете ПРИНЯТЫЕ данные. Операция вывода в SPI одновременно является операций ввода. При этом используется ДВА регистра, один только для чтения, другой только для записи, расположенные по одному адресу. Почитайте как устроен интерфейс SPI. Все значения умноженные на два могкт получиться при неверной настройке фазы/полярности((биты CPHA, CPOL) поиграйтесь ими.

Сообщение отредактировал nanorobot - May 4 2016, 18:37
Go to the top of the page
 
+Quote Post
georgfour
сообщение May 4 2016, 18:33
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Тогда следует ее следует инициализировать с подтяжкой к нулю?
Go to the top of the page
 
+Quote Post
AleksBak
сообщение May 4 2016, 18:33
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Тут или "шашечки или ехать" - выбирать либо использовать готовый кубовский софт и не мучаться, либо разбираться с регистрами читая мануал одновременно. Просто если посмотрите на функцию:
Код
void init_gpio(void)
  {
    GPIOB->CRH|=(GPIO_CRH_CNF13_1|GPIO_CRH_MODE13_0|GPIO_CRH_MODE13_1);
    GPIOB->CRH&=~GPIO_CRH_CNF13_0;//set PA5(SCK) pin for SPI2
    GPIOB->CRH|=(GPIO_CRH_CNF15_1|GPIO_CRH_MODE15_0|GPIO_CRH_MODE15_1);
    GPIOB->CRH&=~GPIO_CRH_CNF15_0;//set PA7(MOSI) pin for SPI2
    GPIOB->CRH|=(GPIO_CRH_MODE12_0|GPIO_CRH_MODE12_1);
    GPIOB->CRH&=~(GPIO_CRH_CNF12_0|GPIO_CRH_CNF12_1);//set PA4(NSS) pin for SPI2 in software mode
  }

то в комментариях одно (PA5 например), а используются биты для порта B и его пина 13. Т.е. уже непонятно откуда этот кусок кода взят и верен ли он. Надо конкретно посмотреть в описаниии контроллера для какого порта и пинов находится альтернативная функция SPI1 (или 2). Эта альтернативная функция кстати не включена. Тактирование ее не включено.
Go to the top of the page
 
+Quote Post
georgfour
сообщение May 4 2016, 18:35
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Я забыл переделать комментарии просто))
Go to the top of the page
 
+Quote Post
nanorobot
сообщение May 4 2016, 18:43
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(georgfour @ May 5 2016, 00:33) *
Тогда следует ее следует инициализировать с подтяжкой к нулю?

Сконфигурировать как неиспользуемую для SPI или использовать для любых других целей, а на содержиое DR после вывода - забить.

можно для проверки моих слов подтянуть к нулю , затем к единице, и сравнить результаты. но проще - забить.

Сообщение отредактировал nanorobot - May 4 2016, 18:45
Go to the top of the page
 
+Quote Post
georgfour
сообщение May 4 2016, 18:49
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Хм, инициализировал с подтяжкой к нулю PB14 (MISO) - в DR вообще теперь нули все после отправки - так должно быть?
Go to the top of the page
 
+Quote Post
nanorobot
сообщение May 4 2016, 18:52
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(georgfour @ May 5 2016, 00:49) *
Хм, инициализировал с подтяжкой к нулю PB14 (MISO) - в DR вообще теперь нули все после отправки - так должно быть?


естественно. подтянете к 1 - будет 0xFFFF

Сообщение отредактировал nanorobot - May 4 2016, 18:54
Go to the top of the page
 
+Quote Post
georgfour
сообщение May 4 2016, 18:53
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Все, я разобрался, спасибо большое)

И да, полярность поменял - теперь все хорошо, спасибо)

Сообщение отредактировал georgfour - May 4 2016, 19:01
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01436 секунд с 7
ELECTRONIX ©2004-2016