В сегодняшнем посте я опишу способ получения данных с платы навигации 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;
}
Вначале инициализация:
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;
}
Комментариев нет:
Отправить комментарий