SPI в libopencm3 под stm32f407
Дела настолько плохи, что у меня не получается даже передача данных между закороченными 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