LINUX.ORG.RU

SPI в libopencm3 под stm32f407

 , ,


1

3

Дела настолько плохи, что у меня не получается даже передача данных между закороченными MISO и MOSI. в каждом нечётном отправленном байте старший бит почему-то устанавливается в 1 . Кто-нибудь сталкивался с такой проблемой?

Инициализация SPI (пины точно выбраны правильно и не конфликтуют с JTAG):

#define SPI_ID SPI1
#define SPI_RCC RCC_SPI1
#define SPI_NSS GPIO4
#define SPI_SCK GPIO5
#define SPI_MISO GPIO6
#define SPI_MOSI GPIO7
#define SPI_RCC_PORT RCC_GPIOA
#define SPI_PORT GPIOA


rcc_periph_clock_enable(SPI_RCC_PORT);
rcc_periph_clock_enable(SPI_RCC);

gpio_mode_setup(SPI_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,
                          SPI_SCK | SPI_MOSI);
gpio_mode_setup(SPI_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE,
                          SPI_MISO);
gpio_set_af(SPI_PORT, GPIO_AF5,
                      SPI_SCK | SPI_MISO | SPI_MOSI);
gpio_set_output_options(SPI_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ,
                                  SPI_SCK | SPI_MOSI);

gpio_set(SPI_PORT, SPI_NSS);
gpio_mode_setup(SPI_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SPI_NSS);

spi_reset(SPI_ID);

spi_init_master(SPI_ID, SPI_CR1_BAUDRATE_FPCLK_DIV_256, 0,
                        0, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);
spi_set_full_duplex_mode(SPI_ID);

spi_enable_software_slave_management(SPI_ID);
spi_set_nss_high(SPI_ID);
SPI_CR2(SPI_ID) |= SPI_CR2_FRF;
gpio_set(SPI_PORT, SPI_NSS);
spi_disable_crc(SPI_ID);
spi_enable(SPI_ID);

Тестирование передачи данных:

void mspi_send(uint32_t spi, uint16_t data) {
	SPI_DR(spi) = data;
	while (!(SPI_SR(spi) & SPI_SR_TXE));
}

void test() {
	uint8_t pid = 0;
	uint8_t rx_value;
	for (pid = 0; pid < 10; ++pid) {
		mspi_send(SPI_ID, pid);
		rx_value = spi_read(SPI_ID);
		printf("Received: %d - %d\n\r", (int)pid, (int)rx_value);
	}
	for (pid = 10; pid > 0; --pid) {
		mspi_send(SPI_ID, pid);
		rx_value = spi_read(SPI_ID);
		printf("Received: %d - %d\n\r", (int)pid, (int)rx_value);
		mspi_send(SPI_ID, pid);
		rx_value = spi_read(SPI_ID);
		printf("Received: %d - %d\n\r", (int)pid, (int)rx_value);
	}
}

Результаты передачи:

Received: 0 - 128
Received: 1 - 1
Received: 2 - 130
Received: 3 - 3
Received: 4 - 132
Received: 5 - 5
Received: 6 - 134
Received: 7 - 7
Received: 8 - 136
Received: 9 - 9
Received: 10 - 138
Received: 10 - 10
Received: 9 - 9
Received: 9 - 137
Received: 8 - 136
Received: 8 - 8
Received: 7 - 7
Received: 7 - 135
Received: 6 - 134
Received: 6 - 6
Received: 5 - 5
Received: 5 - 133
Received: 4 - 132
Received: 4 - 4
Received: 3 - 3
Received: 3 - 131
Received: 2 - 130
Received: 2 - 2
Received: 1 - 1
Received: 1 - 129



Последнее исправление: Selat (всего исправлений: 1)

Замени SPI_SR_TXE на SPI_SR_RXNE в

	while (!(SPI_SR(spi) & SPI_SR_TXE));
TXE - это флаг, означающий то, что байт поступил в сдвиговый регистр передатчика. А тебе надо флаг, означающий, что байт принят (RXNE).

Beewek ★★★
()
Ответ на: комментарий от Beewek

Это ни на что не повлияет, т.к. в spi_read() данные читаются только после установки в 1 бита SPI_SR_RXNE :(

Selat
() автор топика

Проблема решена переходом на SPI2. Но если подключить к нему адаптер для MicroSD card, то независимо от отправляемых адаптеру данных, читается всегда 0xFF - даже если карточка в адаптор не вставлена.

Selat
() автор топика
Ответ на: комментарий от Selat

Но если подключить к нему адаптер для MicroSD card

У вас же f407 подключайте sdio4. Пусть электронный болван работает и не сачкует.

yax123 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.