Хобрук: Ваш путь к мастерству в программировании

Пример программы C для чтения и записи в SPI eeprom в Linux

Я пытаюсь записать 4 байта в spi eeprom на linux, а затем прочитать 4 байта (последний важный, я работаю с zybo board), я сделал все для обнаружения spi eeprom, и теперь у меня есть:

/sys/bus/spi/devices/spi32766.0/eeprom

В этой ссылке: Чтение и запись в spi eeprom... Клаус говорит, что это можно сделать, используя eeprom в качестве символьного файла, но по этой ссылке: Как читать данные... Sawdust говорит, что это невозможно, потому что этот тип драйвера является драйвером платформы.

Я пытался обрабатывать eeprom как символьный файл на C, но полученные данные не связаны (я провел тест на чистом металлическом коде, и устройство SPI работает), возможно, потому, что я не знаю, как данные должны быть отправлены, может кто-нибудь объясните мне фрагмент кода, как я должен читать/записывать в SPI EEPROM?.

Большое спасибо :)

Резюме моего кода:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int readData(FILE* fp);

int main(int argc, char *argv[]) {
    FILE* fp;
    char ch = 'a';
    while (1) {
        fp = fopen("/sys/bus/spi/devices/spi32766.0/eeprom", "r+");
        if (fp == NULL) {
            printf("Cannot open /sys/bus/spi/devices/spi32766.0/eeprom for write\n");
            return -1;
        }
        printf("Sending data\n");
        fputs("\x01\x02\x03\x04", fp);//or fputs(four bytes, fp) 
        while (readData(fp) == 0) {
            sleep(1);
        }
        printf("End\n");
        fclose(fp);
        sleep(5);
    }
    return EXIT_SUCCESS;
}

int readData(FILE* fp) {
    int c = fgetc(fp);
    int retorno = (feof(fp) == NULL);
    printf("Char: %c\n", c);
    printf("Int: %d\n", c);
    return retorno;
}
09.04.2015

  • int retorno = (feof(fp) == NULL); не должен компилироваться в C. Вы должны написать int retorno = (c == EOF);. Вам нужно позвонить fseek() или rewind() между fputs() и fgetc() в тот же FILE. Стандартные потоки, вероятно, не подходят для ваших целей. 09.04.2015
  • @chqrlie: rewind() не потребуется для специальных файлов, таких как узлы устройств или сокеты. Ввод и вывод на них полностью разделены, и запись не влияет на указатель чтения (на самом деле часто указателя вообще нет) 09.04.2015
  • открытие должно быть против /dev/что-то, а не против драйвера платформы. вторая из ваших ссылок ясно объясняет это (прочитайте целиком) 09.04.2015
  • Спасибо за ваши комментарии, я попробую позже, потому что я сейчас не рядом с моим компьютером, @ user3629249 Я знаю, что обычный способ - использовать /dev/something, но как создать /dev/something для драйвера платформы?, спасибо ты. 09.04.2015
  • @Ben Voigt: специальные файлы или нет, стандарт говорит, что это неопределенное поведение. Доступ к узлам устройств с помощью стандартного потока не является хорошей идеей. open, read, write гораздо более прямой и предсказуемый. 09.04.2015
  • @chqrlie: определяется реализацией, а не неопределено. Все, что связано с фактической семантикой доступа к файлам, сильно зависит от реализации; Стандарты C и C++ действительно определяют только аргументы. 09.04.2015
  • @Ben Voigt: при всем уважении, стандарт C11 явно перечисляет в Приложении J.2 Неопределенное поведение: - За операцией вывода в потоке обновления следует операция ввода без промежуточного вызова функции fflush или функция позиционирования файла, или за операцией ввода в потоке обновления следует операция вывода с промежуточным вызовом функции позиционирования файла (7.21.5.3). Некоторые реализации могут определять поведение, но это было бы причудой . Попытка контролировать работу флэш-памяти стандартными потоками выглядит неуклюжей. 10.04.2015

Новые материалы

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

React Hooks: основы деструктуризации массива
Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

Пакеты R, используемые в Tesla
Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

Сокращение и слияние токенов для эффективных моделей VL: обзор
Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..