Перейти к содержанию
    

STM32F100C8 Не могу сделать Remap SPI1

На AF SPI1 (PA4-PA7) работает, нужен Remap на PB3-PB5, PA15. Процессор STM32F100C8. Перекопал и-нет и перепробовал разные примеры, но запустить не могу. Причем, если на работающем AF SPI1 сделать

 // Ремапим 
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
    AFIO->MAPR |= AFIO_MAPR_SPI1_REMAP;

То основной отключается, а "ремаповный" не работает.

 

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

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

 

 // включаем тактирование (=питание) на порты 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
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему для ChipSelect'a в PORT.GPIO_Mode пишется GPIO_Mode_AF_PP, а для остальных ног выбираются обычные режимы входов/выходов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему для ChipSelect'a в PORT.GPIO_Mode пишется GPIO_Mode_AF_PP, а для остальных ног выбираются обычные режимы входов/выходов?

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

 

 

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. Я его включал, но потом закоментировал.

Буду разбираться. Но определённости у меня пока нет. Вы мне показали как не надо, но я и сам понимал, что не правильно, иначе зачем обращаться за советом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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) */
   ;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо друзья за участие.

Проблема у меня решилась очень просто:

Конечно тактировать AFIO обязательно перед REMAP Но главное:

Порядок инициализации и ремап должен быть такой:

Ремапим

 

AFIO->MAPR |= AFIO_MAPR_SPI1_REMAP;

AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;

 

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

Всем спасибо!

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Порядок инициализации и ремап должен быть такой
Вот для кого люди старались, писали, что операции "логическое или" для подобных случаев не подходят? О том, что несколько подобных доступов подряд к одному volatile-регистру генерят операции чтения и записи регистра для каждого подобного выражения?

 

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

post-17095-1489061974_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что, "доку", в смысле RefMan, никто не читает? "Логическое или" можно применять, но из-за write-only SWJ_CFG[2:0] обязан быть задан явно:

AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE | ((AFIO->MAPR & (~AFIO_MAPR_SWJ)) | AFIO_MAPR_SPI1_REMAP);

Не?

 

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вот, Obam не выдержал,

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

 

Вот "заинтересовала" правильная последовательность изменения полей в одном и том же регистре.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...