|
|
  |
STM32F100C8 Не могу сделать Remap SPI1, На AF SPI1 работает, нужен Remap |
|
|
|
Mar 7 2017, 17:11
|
Группа: Новичок
Сообщений: 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] - для короткого!
|
|
|
|
|
Mar 8 2017, 09:07
|
Группа: Новичок
Сообщений: 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. Я его включал, но потом закоментировал. Буду разбираться. Но определённости у меня пока нет. Вы мне показали как не надо, но я и сам понимал, что не правильно, иначе зачем обращаться за советом.
|
|
|
|
|
Mar 8 2017, 13:06
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 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)
|
|
|
|
|
Mar 9 2017, 07:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 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) */ ;
|
|
|
|
|
Mar 9 2017, 11:45
|
Группа: Новичок
Сообщений: 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
Причина редактирования: бездумное цитирование
|
|
|
|
|
Mar 9 2017, 12:19
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 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)
|
|
|
|
|
Mar 9 2017, 16:44
|

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

|
Цитата(Genadi Zawidowski @ Mar 9 2017, 18:44)  Ну вот, Obam не выдержал, Вы меня прям эталоном выдержки представили (; Вот "заинтересовала" правильная последовательность изменения полей в одном и том же регистре. Чой-то вдруг нельзя одним чохом? Проца 100-го нет, а RefMan - есть (: На личности не переходил, никого не обидел; "Я так думаю..." (с) кто там сценарий "Мимино" сочинял
--------------------
Пролетарий умственного труда.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|