Nano Hash - криптовалюты, майнинг, программирование

Использование программатора USBASP для связи SPI

Я пытаюсь отправить некоторые данные с ПК на чип ATmega328P через программатор USBASP.

Он способен передавать до 4 байтов по SPI. Эти 4 байта можно установить в USB Setup Packet (2 байта для wValue и 2 байта для wIndex). Чтобы включить SPI в ATmega328P, я подключил USBASP Reset контакт к SS. На стороне ПК я использую libusb для отправки пакетов настройки USB.

Код ATmega328P:

int main()
{
    char spiData = 0;

    // Enable SPI
    SPCR |= 1 << SPE;
    DDRB |= 1 << 4;

    // Main cycle
    while(1)
    {
        while(!(SPSR & (1 << SPIF))); // Wait for transmission end
        spiData = SPDR; // Read SPI Data Register
        // Do something with first byte

        while(!(SPSR & (1 << SPIF)));
        spiData = SPDR;
        // Do something with second byte

        while(!(SPSR & (1 << SPIF)));
        spiData = SPDR;
        // Do something with third byte

        while(!(SPSR & (1 << SPIF)));
        spiData = SPDR;
        // Do something with fourth byte
    }
    return 0;
}

Код ПК (С#):

static void Main(string[] args)
{
    // Find USBASP
    var device = UsbDevice.OpenUsbDevice(new UsbDeviceFinder(0x16C0, 0x05DC));

    // Set Clock and RESET pin to enable SPI
    int bytesTrasferred;
    var usbSetupPacket = new UsbSetupPacket(0xC0, 1, 0, 0, 0);
    device.ControlTransfer(ref usbSetupPacket, null, 0, out bytesTrasferred);

    // Send Setup Packets
    while (Console.ReadKey(true).Key == ConsoleKey.Enter)
    {
        byte[] buffer = new byte[4];
        usbSetupPacket = new UsbSetupPacket(0xC0, 3, 200, 200, 0);
        device.ControlTransfer(ref usbSetupPacket, buffer, 4, out bytesTrasferred);
        Console.WriteLine("Done. Return result: [{0}, {1}, {2}, {3}]", buffer[0], buffer[1], buffer[2], buffer[3]);
    }

    // Disable SPI
    usbSetupPacket = new UsbSetupPacket(0xC0, 2, 0, 0, 0);
    device.ControlTransfer(ref usbSetupPacket, null, 0, out bytesTrasferred);

    // Free resources
    device.Close();
    UsbDevice.Exit();
}

Связь USBASP -> ATmega328P SPI работает хорошо, но кажется, что данные в полях wValue и wIndex установочного пакета поступают в USBASP поврежденными, потому что я получаю этот вывод (хотя он должен быть постоянным - [0, 200, 0, 200] ):

[0, 153, 0, 128]
[0, 136, 0, 128]
[1, 209, 1, 217]
[1, 128, 0, 145]
[1, 153, 0, 128]
[0, 145, 1, 209]
[1, 217, 1, 136]
[0, 209, 1, 209]
[1, 217, 1, 136]
so on...

Также я вижу эти цифры на светодиодном цифровом дисплее, подключенном к ATmega328P.

Кто-нибудь может это объяснить?

P.S. Для целей программирования этот USBASP работает хорошо.

17.05.2013

Ответы:


1

Но проблема была в SPI. Мой ATmega328P был настроен по умолчанию на внутреннюю тактовую частоту 8 МГц с делителем 1/8, поэтому у него была частота 1 МГц, что слишком мало для правильной связи SPI. Я исправил это, настроив ATmega328P на внешний кварц 16 МГц.

20.05.2013

2

Вы также можете установить скорость передачи данных на 750 КБ в libusb или, если эта программа не поддерживает изменение скорости передачи, используйте программу, такую ​​​​как avrdude, которая может это сделать.

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

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..