Подключение stm32 к RPi через SPI

324
30 сентября 2017, 22:43

Делаю адаптер SPI-CAN на основе stm32f103c8t6 для RPi 3 и столкнулся с рядом проблем и вопросов.

1) Программа на RPi. Для работы с SPI использую библиотеку bcm2835-spi. Вся программа зависает при попытке отправки сообщения:

#include <QCoreApplication>
#include </home/pi/CAN_Process/src/bcm2835.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <string.h>
#include <stdio.h>
int main(void)
{
    //SPI INIT
    if (!bcm2835_init())
    {
        printf("bcm2835_init failed. Are you running as root??\n");
        return 1;
    }
    bcm2835_spi_begin();
    bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default
    bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                   // The default
    bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_64); // 64 прескаллер
    bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      // The default
    bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default
    uint8_t spi_write[11];
    uint8_t spi_read[11];
    //infinite
    while(1){
        for(uint8_t i=0;i<11;i++)spi_write=i;//Просто заполнение массива    
        bcm2835-spi-transfern(spi_write,11);//Строчка на которой всё зависает
    }
    bcm2835_spi_end();
    bcm2835_close();
    return 1;
}

Если у кого то есть готовый рецепт SPI для библиотеки WiringPI, то готов с радостью на неё перейти.

2) Настройка SPI. Так как частота процессора RPi 3 400 МГц и для тактирования SPI можно выбрать прескаллеры только кратные двум, а частота кварца Stm32 8 МГц и частоту SPI тоже нельзя выбрать любую, то нельзя выбрать одинаковые частоты. Я выбрал частоту SPI на RPi 6.250MHz. А на stm32 максимальную (18 Мбит/с), понадеявшись, что он всё равно будет синхронизироваться по шине CLK. Правильно это или нет?

3) Программа на stm32. Работаю через CubeMX и библиотеку HAL. При инициализации SPI, не инициализируется ножка для выбора Slave. Я понимаю, что у нас stm32 работает в качестве ведомого, но как тогда правильно реализовать работу шины CE со стороны stm32? У меня на эту шину SPI всего один ведомый, значит ли это, что выбор slave со стороны stm32 можно никак не обрабатывать? Большущее спасибо.

READ ALSO
C++. Функция LoadString

C++. Функция LoadString

Согласно спецификации функция LoadString принимает среди параметров уникальный целочисленный идентификатор строкиЧто это такое? Каким значением...

223
QtCreator не создает файл .exe

QtCreator не создает файл .exe

Установил Qt Creator 40

204
Идентификатор rand не определен, почему?

Идентификатор rand не определен, почему?

Visual Studio ни в какую не хочет работать с функцией rand()Пишу на C++

1132
Webpack 2 jQuery

Webpack 2 jQuery

Как подключить в webpack 2 jquery

494