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

 
 
 
Reply to this topicStart new topic
> STM32F100C8 Не могу сделать Remap SPI1, На AF SPI1 работает, нужен Remap
KWlad
сообщение Mar 7 2017, 17:11
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 7-03-17
Пользователь №: 95 736



На AF SPI1 (PA4-PA7) работает, нужен Remap на PB3-PB5, PA15. Процессор STM32F100C8. Перекопал и-нет и перепробовал разные примеры, но запустить не могу. Причем, если на работающем AF SPI1 сделать
Код
// Ремапим
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
    AFIO->MAPR |= AFIO_MAPR_SPI1_REMAP;
То основной отключается, а "ремаповный" не работает.

Привожу кусок инициализации, может кто-то подскажет, в чем проблема!
Технически МП проверил, нужные Рин ы устанавливаются и сбрасываются прграммно.

CODE
// включаем тактирование (=питание) на порты A, B и железный SPI1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE);

// Ремапим SPI1
AFIO->MAPR |=AFIO_MAPR_SPI1_REMAP ;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

GPIO_InitTypeDef PORT;
void GPIOInit(void)
{
// выбрали ноги для настройки
PORT.GPIO_Pin = NSS_Pin; //Pin15
// установили наименьшую скорость
PORT.GPIO_Speed = GPIO_Speed_2MHz;
// (важно!) определяем предназначение ног. здесь - выбор "альтернативной функции" ног
PORT.GPIO_Mode = GPIO_Mode_AF_PP;
// настроили ногу в порту А
GPIO_Init(GPIOA, &PORT);

// выбрали ноги для настройки
PORT.GPIO_Pin = SCK_Pin | MOSI_Pin; //Pin PB3, Pin PB5
// установили скорость
PORT.GPIO_Speed = GPIO_Speed_2MHz;
// предназначение - общее, выход
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
// настроили ноги в порту B
GPIO_Init(GPIOB, &PORT);

PORT.GPIO_Pin = MISO_Pin; //Pin4
// установили скорость
PORT.GPIO_Speed = GPIO_Speed_2MHz;
// предназначение - общее, выход
PORT.GPIO_Mode = GPIO_Mode_IPU;
// настроили ногу в порту B
GPIO_Init(GPIOB, &PORT);
};
void SPIInit(void) {
SPI_InitTypeDef SPIConf;
// указываем, что используем мы только передачу данных
SPIConf.SPI_Direction = SPI_Direction_1Line_Tx;
// указываем, что наше устройство - Master
SPIConf.SPI_Mode = SPI_Mode_Master;
// передавать будем по 8 бит (=1 байт)
SPIConf.SPI_DataSize = SPI_DataSize_8b;
// режим 00
SPIConf.SPI_CPOL = SPI_CPOL_Low;
SPIConf.SPI_CPHA = SPI_CPHA_1Edge;
// будем устанавливать SS программно (даже необязательно тогда будет припаивать SS)
SPIConf.SPI_NSS = SPI_NSS_Soft;
// установим скорость передачи (опытным путём выяснили, что разницы от изменения этого параметра нет)
SPIConf.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
// передаём данные старшим битом вперёд (т.е. слева направо)
SPIConf.SPI_FirstBit = SPI_FirstBit_MSB;
// внесём настройки в SPI
SPI_Init(SPI1, &SPIConf);
// включим SPI1
// SPI_Cmd(SPI1, ENABLE);
}
Последний кусок из примера в интернете.

Сообщение отредактировал IgorKossak - Mar 8 2017, 13:04
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Mar 7 2017, 17:23
Сообщение #2


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

Группа: Участник
Сообщений: 105
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Почему для ChipSelect'a в PORT.GPIO_Mode пишется GPIO_Mode_AF_PP, а для остальных ног выбираются обычные режимы входов/выходов?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 7 2017, 17:48
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 445
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



1) Не увидел вклюючения тактирования AFIO
2) вот так AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE делать нельзя. Почему - ответ в описании регистра MAPR на странице 121 в TRM.
Как пример, после операции AFIO->MAPR |=AFIO_MAPR_SPI1_REMAP состояние битов AFIO_MAPR_SWJ_CFG неопределено.

Сообщение отредактировал Genadi Zawidowski - Mar 7 2017, 17:50
Go to the top of the page
 
+Quote Post
KWlad
сообщение Mar 8 2017, 09:07
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 7-03-17
Пользователь №: 95 736



Цитата(ohmjke @ Mar 8 2017, 00:23) *
Почему для ChipSelect'a в PORT.GPIO_Mode пишется GPIO_Mode_AF_PP, а для остальных ног выбираются обычные режимы входов/выходов?

Потому, что к сожалению, не знаю как правильно для режима Remap и прошу помочь.


Цитата(Genadi Zawidowski @ Mar 8 2017, 00:48) *
1) Не увидел вклюючения тактирования AFIO
2) вот так AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE делать нельзя. Почему - ответ в описании регистра MAPR на странице 121 в TRM.
Как пример, после операции AFIO->MAPR |=AFIO_MAPR_SPI1_REMAP состояние битов AFIO_MAPR_SWJ_CFG неопределено.

Спасибо,
Я эти варианты брал из примеров в и-нете как рабочие.
Я считал, что "RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE);"
достаточно для включения тактирования. Значит нужно дополнительно тактировать режим AFIO. Я его включал, но потом закоментировал.
Буду разбираться. Но определённости у меня пока нет. Вы мне показали как не надо, но я и сам понимал, что не правильно, иначе зачем обращаться за советом.
Go to the top of the page
 
+Quote Post
x893
сообщение Mar 8 2017, 12:41
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 848
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Remap не будет без AFIO (как бы намек на Alternative Function Input Output)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 8 2017, 13:06
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 7 832
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (x893 @ Mar 8 2017, 14:41) *
как бы намек
Да там как бы и без намеков AFIO->MAPR.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alechek
сообщение Mar 9 2017, 07:08
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 127
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Genadi Zawidowski @ Mar 7 2017, 22:48) *
2) вот так AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE

Так как бы с volatile переменными вообще так:
Код
// Ремапим
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
    AFIO->MAPR |= AFIO_MAPR_SPI1_REMAP;

не стоит делать.... Каждый раз чтение-модификация-запись...

Для ТС пример как надо (F103):

Код
#define  LSB_FROM_MASK(x) (x & -x)
  AFIO->MAPR = 0
    | AFIO_MAPR_SPI1_REMAP                * 1 /*!< SPI1 remapping */
    | AFIO_MAPR_I2C1_REMAP                * 0 /*!< I2C1 remapping */
    | AFIO_MAPR_USART1_REMAP              * 1 /*!< USART1 remapping */
    | AFIO_MAPR_USART2_REMAP              * 0 /*!< USART2 remapping */
    | LSB_FROM_MASK(AFIO_MAPR_TIM1_REMAP) * 0 /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */
    | LSB_FROM_MASK(AFIO_MAPR_TIM2_REMAP) * 1 /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */
    | LSB_FROM_MASK(AFIO_MAPR_TIM3_REMAP) * 0 /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */
    | LSB_FROM_MASK(AFIO_MAPR_CAN_REMAP)  * 0 /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */
    | AFIO_MAPR_PD01_REMAP                * 0 /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */
    | LSB_FROM_MASK(AFIO_MAPR_SWJ_CFG)    * 2 /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */
   ;


Go to the top of the page
 
+Quote Post
KWlad
сообщение Mar 9 2017, 11:45
Сообщение #8





Группа: Новичок
Сообщений: 3
Регистрация: 7-03-17
Пользователь №: 95 736



Цитата(Alechek @ Mar 9 2017, 14:08) *

Спасибо друзья за участие.
Проблема у меня решилась очень просто:
Конечно тактировать AFIO обязательно перед REMAP Но главное:
Порядок инициализации и ремап должен быть такой:
Ремапим

AFIO->MAPR |= AFIO_MAPR_SPI1_REMAP;
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;

И всё заработало на 100 и 103 процессоре проверил.
Всем спасибо!

Сообщение отредактировал IgorKossak - Mar 9 2017, 19:09
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 9 2017, 12:19
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 7 832
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (KWlad @ Mar 9 2017, 13:45) *
Порядок инициализации и ремап должен быть такой
Вот для кого люди старались, писали, что операции "логическое или" для подобных случаев не подходят? О том, что несколько подобных доступов подряд к одному volatile-регистру генерят операции чтения и записи регистра для каждого подобного выражения?

Впрочем, у вас в конкретном случает работает и ладно.
Прикрепленное изображение


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 9 2017, 13:32
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 470
Регистрация: 14-11-14
Пользователь №: 83 663



А что, "доку", в смысле RefMan, никто не читает? "Логическое или" можно применять, но из-за write-only SWJ_CFG[2:0] обязан быть задан явно:
AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE | ((AFIO->MAPR & (~AFIO_MAPR_SWJ)) | AFIO_MAPR_SPI1_REMAP);
Не?


Сообщение отредактировал Obam - Mar 9 2017, 13:33


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 9 2017, 14:44
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 445
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Ну вот, Obam не выдержал, дал рыбку... А то глядишь, до чтения референс мануала на указанной в третьем сообщении странице дошло бы дело через месяц. Теперь точно не дойдет.
Пошли размышления про volatile... Ничего, мы еще будем лечить исчезающие необработанными прерывания из-за копирования из интернета "рабочих" кусков кода со сбросом битов в регистрах хитрой операцией.

Сообщение отредактировал Genadi Zawidowski - Mar 9 2017, 14:45
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 9 2017, 16:44
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 470
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(Genadi Zawidowski @ Mar 9 2017, 18:44) *
Ну вот, Obam не выдержал,

Вы меня прям эталоном выдержки представили (;

Вот "заинтересовала" правильная последовательность изменения полей в одном и том же регистре.
Чой-то вдруг нельзя одним чохом? Проца 100-го нет, а RefMan - есть (:

На личности не переходил, никого не обидел; "Я так думаю..." (с) кто там сценарий "Мимино" сочинял


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th March 2017 - 09:08
Рейтинг@Mail.ru


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