|
STM32F100 SPI no SCK |
|
|
|
Apr 20 2014, 16:31
|
Группа: Участник
Сообщений: 13
Регистрация: 27-02-14
Пользователь №: 80 722

|
Здравствуйте. Пытаюсь связать LIS3DH и STM32F100 по SPI. Использую Software режим, fullduplex. Проблема в том, что на выходе SCK нет такта - все время висит высокий или низкий уровень в зависимости от CPOL. Не выставляются флаги Busy и RXNE, не сбрасывается флаг TXE. Ниже приведен код, проект собран в Keil. Проект испытывал на собранной плате, на STM32F0 DISCOVERY. Также пробовал загружать пример от STM на плату STM32F4 (MEMS акселерометр). Везде одна и та же проблема - SPI мертв. Видимо упускаю что-то системное, что то общее для всех 3х плат, но у меня уже нет идей, что это может быть. Прошу помощи.
#include "stm32f10x.h" #include "stm32f10x_spi.h"
void init(); void spi();
void main() { init(); while(1) { spi();
} }
void init() {
RCC->APB2ENR^=(1<<0 | 1<<2 | 1<<3 | 1<<5 | 1<<12 ); // spi1, GPIO clock enable GPIOA->CRL&=0x000000ff; // port A config to spi GPIOA->CRL^=0xb4b34b00;
SPI1->CR1=(1<<0|1<<1|1<<5|1<<8|1<<9); // spi config }
void spi() { unsigned char ax=0; unsigned char ay=0; unsigned char az=0; unsigned char temp; temp=0xE8; SPI1->CR1^=(1<<2|1<<6); // SPI enable
while (!(SPI1->SR & SPI_SR_TXE)); // if tx empty then transfer SPI1->DR = temp; while (!(SPI1->SR & SPI_SR_RXNE)); ax= SPI1->DR; SPI1->DR = temp; while (!(SPI1->SR & SPI_SR_RXNE)); // wait before reiceve ends ay = SPI1->DR; SPI1->DR = temp; while (!(SPI1->SR & SPI_SR_RXNE)); // wait before reiceve ends az= SPI1->DR; SPI1->CR1^=(1<<6); // SPI disable }
|
|
|
|
|
 |
Ответов
|
Apr 21 2014, 17:18
|
Группа: Участник
Сообщений: 13
Регистрация: 27-02-14
Пользователь №: 80 722

|
Спасибо что откликнулись. С вашим исходником у меня проект не собрался, но на его основе я написал следующее:
#include "stm32f10x.h" #include "stm32f10x_spi.h" SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
void init(); void delay(); void spi(); void uart();
void main() { init(); while(1) { spi();
} }
void init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //GPIO A clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // SPI 1 clock enable
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; // PA5(SCK),PA7(MOSI)- out AF PP GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6; //PA5(MISO)- AF Input pullup, GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // spi config SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE);
}
void spi() { unsigned char ax=0; unsigned char ay=0; unsigned char az=0; unsigned char temp; temp=0xE8;
while (!(SPI1->SR & SPI_SR_TXE)); // if tx empty then transfer SPI1->DR = temp; while (!(SPI1->SR & SPI_SR_RXNE)); ax= SPI1->DR; SPI1->DR = temp; while (!(SPI1->SR & SPI_SR_RXNE)); // wait before reiceve ends ay = SPI1->DR; SPI1->DR = temp; while (!(SPI1->SR & SPI_SR_RXNE)); // wait before reiceve ends az= SPI1->DR; SPI1->CR1^=(1<<6); // SPI disable }
Результат тот же - такта нет. Может есть идеи? Ну и еще вопрос вдогонку: по умолчанию используется HSI в связке с PLL в качестве источника тактового сигнала, я ради интереса выводил сигнал с выхода HSI, с выхода PLL, а также с HSE на вывод MCO. Во всех 3 случаях сигнал на выводе MCO был похож на синус на основной частоте + 2-я, может быть 3-я гармоника. Это нормально?
|
|
|
|
Сообщений в этой теме
P4R4N014C STM32F100 SPI no SCK Apr 20 2014, 16:31 A.Lex Могу предложить для сравнения работающий код иници... Apr 20 2014, 18:07 P4R4N014C Такт и данные на выводе MOSI появляются при запуск... Apr 22 2014, 16:10 Сергей Борщ Цитата(P4R4N014C @ Apr 22 2014, 19:10) Та... Apr 24 2014, 06:28 toweroff Цитата(P4R4N014C @ Apr 20 2014, 20:31) Зд... Apr 22 2014, 16:35 P4R4N014C Опыт общения на форумах почти нулевой, так что нек... Apr 23 2014, 05:53 Сергей Борщ Цитата(P4R4N014C @ Apr 23 2014, 08:53) Оп... Apr 23 2014, 07:34 P4R4N014C Позовите еще кого-нибудь, пусть тоже напишут об ош... Apr 23 2014, 11:32 toweroff Цитата(P4R4N014C @ Apr 23 2014, 15:32) По... Apr 23 2014, 11:59 ViKo Пока не залезете в Reference Manual и не изучите р... Apr 23 2014, 13:14 P4R4N014C Viko, спасибо за ответ!
Цитата(toweroff ... Apr 23 2014, 15:10 toweroff Цитата(P4R4N014C @ Apr 23 2014, 19:10) Мн... Apr 23 2014, 16:02  P4R4N014C Цитата(toweroff @ Apr 23 2014, 20:02) хор... Apr 23 2014, 16:28 toweroff В инициализации много ума нет. Сложно было провери... Apr 23 2014, 18:26 P4R4N014C Цитата(toweroff @ Apr 23 2014, 22:26) В и... Apr 24 2014, 04:37 toweroff Еще один вариант - что при отладке отображаются ре... Apr 24 2014, 08:06
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|