Цитата(ChipKiller @ Jan 23 2012, 20:29)

... надеюсь все теперь все ОК ... код из рабочего примера
Благодарю за рабочий код, действительно все заработало, с меня пиво
Я разобрался в чем была промашка, надо было назначить выходы в режиме альтернативной функции.
Код
GPIOA->CRL |= GPIO_CRL_MODE7; // Выход MOSI PA.7 (50 MHz)
GPIOA->CRL &= ~GPIO_CRL_CNF7_0; // Push-Pull
GPIOA->CRL |= GPIO_CRL_CNF7_1; // с альтернативной функцией !!!!!!
Позволю себе выложить весь код тестовой программы в том же стиле.
Такой "долбеж" по регистрам неизбежен на начальном этапе освоения камня,
есть ощущение проникновения в сакральный смысл регистров
CODE
#include "stm32f10x.h"
u8 temp;
void main()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта A.
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // Тактирование альтернативных функций GPIO.
GPIOA->CRL |= GPIO_CRL_MODE7; // Выход MOSI PA.7 (50 MHz)
GPIOA->CRL &= ~GPIO_CRL_CNF7_0; // Push-Pull
GPIOA->CRL |= GPIO_CRL_CNF7_1; // с альтернативной функцией !!!!!!
GPIOA->CRL &= ~GPIO_CRL_MODE6; // Вход MISO PA.6
GPIOA->CRL &= ~GPIO_CRL_CNF6_0; //
GPIOA->CRL |= GPIO_CRL_CNF6_1; // with Pull-Up
GPIOA->CRL |= GPIO_CRL_MODE5; // Выход SCK PA.5 (50 MHz)
GPIOA->CRL &= ~GPIO_CRL_CNF5_0; // Push-Pull
GPIOA->CRL |= GPIO_CRL_CNF5_1; // с альтернативной функцией !!!!
GPIOA->CRL |= GPIO_CRL_MODE4; // Выход NSS PA.4 (50 MHz)
GPIOA->CRL &= ~GPIO_CRL_CNF4; // Push-Pull General Purpose
GPIOA->BSRR = GPIO_BSRR_BS4; //
AFIO->MAPR &= ~AFIO_MAPR_SPI1_REMAP; //Сбрасываем REMAP для SPI на PA4-7
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
SPI1->CR1 &= ~SPI_CR1_SPE; //Запрещаем SPI перед изменениями настроек
SPI1->CR1 |= SPI_CR1_BR_0; //Задаем скорость
SPI1->CR1 |= SPI_CR1_BR_1;
SPI1->CR1 |= SPI_CR1_CPOL; //Задаем режим
SPI1->CR1 |= SPI_CR1_CPHA; //
SPI1->CR1 &= ~SPI_CR1_DFF; //Формат данных 8 бит
SPI1->CR1 &= ~SPI_CR1_CRCEN; //Запрет CRC
SPI1->CR1 &= ~SPI_CR1_CRCNEXT; //Отключение передачи CRC
SPI1->CR1 &= ~SPI_CR1_RXONLY; //и прочих не fullduplex настроек
SPI1->CR1 &= ~SPI_CR1_SSM; //на всякий случай..
SPI1->CR1 &= ~SPI_CR1_SSI;
SPI1->CR1 &= ~SPI_CR1_LSBFIRST; //MSB вперед
SPI1->CR1 |= SPI_CR1_MSTR; //В режиме Мастер
SPI1->CR1 &= ~SPI_CR1_BIDIMODE;
SPI1->CR1 &= ~SPI_CR1_BIDIOE;
SPI1->CR1 |= SPI_CR1_SPE; // Включаем SPI
while(1)
{
while (SPI1->SR & SPI_SR_BSY);
while (!(SPI1->SR & SPI_SR_TXE));
SPI1->DR = 0x55; // Передача данных
while (SPI1->SR & SPI_SR_BSY);
while (!(SPI1->SR & SPI_SR_RXNE));
temp = SPI1->DR; // Чтение принятых данных
}
}
Кстати, пошагово в отладчике программа не проходит проверку на RXNE и попадает в бесконечный цикл.
Видать, где-то, RXNE успевает сброситься.
Сам кусок кода с записью и чтением я взял на форуме ST
здесьАвтор утверждает, что у него код работает только в этом порядке, хотя в мануале RM0041 не рекомендуют проверять
BSY при каждой посылке и приеме.
Цитата
Note: Do not use the BSY flag to handle each data transmission or reception. It is better to use the
TXE and RXNE flags instead.
Сообщение отредактировал IgorKossak - Jan 24 2012, 09:50
Причина редактирования: [codebox]