STM32F030F4 SPI

Минздрав предупреждает: данный материал может оскорбить чувства профессионалов и зануд.


Инициализация
void SPI_init(void){
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);  // SCK
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);  // MISO
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);  // MOSI
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    SPI_I2S_DeInit(SPI1);
    SPI_StructInit(&SPI_InitStructure);
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &SPI_InitStructure);
    SPI_Cmd(SPI1, ENABLE);
   
    // CSN pin config
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}


Для примера подключим модуль NRF24L01: PA5 — SCK, PA6 — MISO, PA7 — MOSI, CSN — PA9. Вывод модуля CE нужен для приема/передачи по радиоканалу и в данном случае не используется.

Запись в регистр RF_CH. Операция записи состоит из передачи двух байт: адреса куда пишем и значения которое пишем.

GPIO_ResetBits(GPIOA, GPIO_Pin_9);

SPI_SendData8(SPI1, 0x20 | 0x05);    // операция запись + адрес 0x05
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_ReceiveData8(SPI1);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

SPI_SendData8(SPI1, 0x11);    // значение регистра
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_ReceiveData8(SPI1);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

GPIO_SetBits(GPIOA, GPIO_Pin_9);


Чтение из регистра RF_CH. Чтение аналогично записи: адрес откуда читаем и значение которое прочиталось.

GPIO_ResetBits(GPIOA, GPIO_Pin_9);

SPI_SendData8(SPI1, 0x00 | 0x05);    // операция чтения + адрес 0x05
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_ReceiveData8(SPI1);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
        
SPI_SendData8(SPI1, 0x00);    // отсылаем любое значение
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
rf_ch = SPI_ReceiveData8(SPI1);    // читаем значение регистра
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

GPIO_SetBits(GPIOA, GPIO_Pin_9);


SCN, он же GPIO_Pin_9, выставляем в ноль в знак того что девайс выбран для работы с ним. После завершения обмена поднимаем в единицу.
  • 0
  • 06 февраля 2016, 23:27
  • aliaksei

Комментарии (5)

RSS свернуть / развернуть
Уже и пилили бы статью полноценную про запил связи между двумя NRF24L01=))
З.Ы. Кажется я нашел себе занятие на воскресенье! Теперь осталось самое сложное, в завалах отыскать модульки NRF24L01=))
0
  • avatar
  • kalik
  • 06 февраля 2016, 23:49
По-моему этих статей и библиотек уже в избытке на все платформы есть.
0
на этот камень не встречал еще
0
И чем оно на STM F030 отличается от других?
0
На какой максимальной частоте можно передавать данные в STM32F030F4 по SPI, если STM — Slave? С STM32 не работал, интересует применение ее в схемах с перехватом данных.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.