понедельник, 4 февраля 2013 г.

STM32, UM6, SPI...

В сегодняшнем посте я опишу способ получения данных с платы навигации UM6 по протоколу SPI.
Вначале инициализация:

void SPI1_Init(void)
{
RCC->APB2ENR |=  RCC_APB2ENR_AFIOEN;     //включить тактирование льтернативных функций        /
RCC->APB2ENR |=  RCC_APB2ENR_IOPAEN;     //включить тактирование порта А
//вывод управления SS: выход двухтактный, общего назначения,50MHz                             /
GPIOA->CRL   |=  GPIO_CRL_MODE4;    //
GPIOA->CRL   &= ~GPIO_CRL_CNF4;     //
GPIOA->BSRR   =  GPIO_BSRR_BS4;     //

//вывод SCK: выход двухтактный, альтернативная функция, 50MHz
GPIOA->CRL   |=  GPIO_CRL_MODE5;    //
GPIOA->CRL   &= ~GPIO_CRL_CNF5;     //
GPIOA->CRL   |=  GPIO_CRL_CNF5_1;   //

//вывод MISO: вход цифровой с подтягивающим резистором, подтяжка к плюсу
GPIOA->CRL   &= ~GPIO_CRL_MODE6;    //
GPIOA->CRL   &= ~GPIO_CRL_CNF6;     //
GPIOA->CRL   |=  GPIO_CRL_CNF6_1;   //
GPIOA->BSRR   =  GPIO_BSRR_BS6;     //

//вывод MOSI: выход двухтактный, альтернативная функция, 50MHz
GPIOA->CRL   |=  GPIO_CRL_MODE7;    //
GPIOA->CRL   &= ~GPIO_CRL_CNF7;     //
GPIOA->CRL   |=  GPIO_CRL_CNF7_1;   //

RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //подать тактирование                                      /
SPI1->CR1     = 0x0000;             //очистить первый управляющий регистр
SPI1->CR2     = 0x0000;             //очистить второй управляющий регистр
SPI1->CR1    |= SPI_CR1_MSTR;       //контроллер должен быть мастером  
SPI1->CR1    |= SPI_CR1_BR;         //задаем скорость
SPI1->CR1    |= SPI_CR1_SSI;        //обеспечить высокий уровень программного NSS
SPI1->CR1    |= SPI_CR1_SSM;        //разрешить программное формирование NSS
SPI1->CR1    |= SPI_CR1_SPE;        //разрешить работу модуля SPI
}
Инициализация взята с одного из сайтов про STM32, однако там не было указанного главного: для того, чтобы читать с этой платы, необходимо устанавливать SS в 0.

Пример получения регистра Yaw(0x63):

float getYaw()
{
u8 b3,b2,b1,b0,temp1,temp2;
short tempshort;
float angle;
GPIOA->BSRR   =  GPIO_BSRR_BR4;
temp1=send_spi1(0x00);
temp2=send_spi1(0x63);
b3=send_spi1(0x00);
b2=send_spi1(0x00);
b1=send_spi1(0x00);
b0=send_spi1(0x00);
GPIOA->BSRR   =  GPIO_BSRR_BS4;
        tempshot=(b3*256)+b2;// глюк блоггера, не могу опубликовать код со смещением
angle=tempshort*0.0109863;
return angle;
}
Функция send_spi1 (взята с одного из форумов по контроллерам) одновременно пишет и читает данные:

u8 send_spi1(u8 byte)
{
    unsigned char rxbyte;
    while (!(SPI1->SR & SPI_SR_TXE));
    SPI1->DR = byte;
    while (!(SPI1->SR & SPI_SR_RXNE));
    rxbyte = SPI1->DR;
    return rxbyte;
}



Комментариев нет:

Отправить комментарий