Перейти к содержанию
    

codebreaker7

Участник
  • Постов

    10
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Скинул краткое описание имеющегося опыта работы в данном направлении на почту (возможно, попало в спам). Не подходит?
  2. Для большей ясности картины изображения, из которых видно, что при одиночной передаче символа все идет нормально: При последующей попытке передачи файла (файл заполнен буквами G - 1024 буквы): Видно, что в начале все передается хорошо, а потом происходит сбой и данные передаются неправильно. Может кто-то сталкивался с подобным. Режим SPI - SPI Mode 0.
  3. Все-таки проблема с Mode 0 никуда не делась: при передаче относительно больших посылок данные идут неправильно. Типичный случай: передается посылка из 64 байт часть доходит нормально, а потом начинается прием непонятно чего. В чем еще может быть проблема в таком случае? Интересно, что в SPI Mode 2 удается принимать безошибочно намного большие объемы данных.
  4. Режим работы указывается с помощью GPIO_Mode_AF. Далее функцией Gpio_PinAFConfig() указываем, к какой именно функции нужно подключиться. Поэтому, как мне кажется, все правильно.
  5. Проблема передачи для SPI mode 0 решилась следующим образом: вначале устанавливается высокий уровень сигнала SS на FT2232, перед передачей он переводится в 0 и сразу же записываются данные. Сработало для нескольких устройств.
  6. при параметре CPHA_1Edge данные принимаются как описано выше, при параметре CPHA_2Edge первая посылка принимается нормально, а дальше данные идут неправильно. Точнее все происходит следующим образом: с ПК запускается программа, переводящая в режим SPI и отправляющая пакет - результат наблюдается в памяти, он правильный, по завершении программа выходит из режима SPI; следующие принятые данные некорректны. Но проблема еще в том, что в доках на FTDI написано, что в режиме работы с SPI (MPSSE) доступны только режимы 0 и 2. А если выставляем CPHA_2Edge, то это SPI mode 1.
  7. С начальной проблемой разобрался: код из примера для FTDI работал так, что начальный уровень CLK выставлялся в 1, а на плате ожидался совсем другой режим, когда CLK работает с 0. Поменяв CPOL с Low на High, получил нормальный прием. Но появилась вторая проблема: когда я хочу передать данные, задав низкий начальный уровень сигнала CLK на FTDI, я получаю следующий результат. передаю - 0x47, 0x48, 0xaa получаю - 0x23, 0xa4, 0x55 Если посмотреть двоичный код, то видно, что в начале посылки появился 0, а дальше все записывается нормально. Непонятно, откуда берется этот 0. На STM32F4 Discovery устанавливаю параметры для приема в режиме SPI 0 - CPOL_Low, CPHA_1Edge. как это можно сделать?
  8. Извиняюсь за скудность описанной вначале информации: изначально думал, что проблема именно здесь. Добавлю еще по поводу передающего устройства. Используется FT2232H Mini Module, который переводится в режим MPSSE для передачи по SPI. Процедура перехода в данный режим стандартная и сопровождается включением режима loopback - все отрабатывает нормально - и его отключением. Выставляется предделитель, чтобы частота передачи была 1 МГц и насстраиваются пины. Насчет конфигураций выходов (т.е. по назначению вход/выход), то пробовал разные варианты для CS: в одном случае передача не идет, в другом - выявляются описанные выше проблемы.
  9. По идее, да, т.к. на мастере я только передаю данные. Это я так понял. Может в этом направлении и искать?
  10. Пытаюсь получить данные с другого устройства по SPI на STM32F4 Discovery. Для начала отправляю по 1 байту. Первый приходит нормально, следующие - неправильно. Причем полученные данные выглядят следующим образом: для 1 - 0x81, для 0x47 - 0xC7, т.е. появляется 1 в начале. Результат приема смотрю в DMA. При попытке передать большее количество байт видно, что не все приходит, например, передано 10 байт, а в памяти только 6 или 7. Передача ведется на частоте 1 МГц. void init(void) { GPIO_InitTypeDef gpio_init; SPI_InitTypeDef spi_init; DMA_InitTypeDef dma_init; NVIC_InitTypeDef nvic_init; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); gpio_init.GPIO_Mode = GPIO_Mode_AF; gpio_init.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL; gpio_init.GPIO_OType = GPIO_OType_PP; gpio_init.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOB, &gpio_init); gpio_init.GPIO_PuPd = GPIO_PuPd_DOWN; gpio_init.GPIO_Pin = GPIO_Pin_12; //NSS GPIO_Init(GPIOB, &gpio_init); nvic_init.NVIC_IRQChannel = SPI2_IRQn; nvic_init.NVIC_IRQChannelCmd = ENABLE; nvic_init.NVIC_IRQChannelSubPriority = 1; nvic_init.NVIC_IRQChannelPreemptionPriority = 1; NVIC_Init(&nvic_init); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); SPI_StructInit(&spi_init); spi_init.SPI_Mode = SPI_Mode_Slave; spi_init.SPI_CPHA = SPI_CPHA_1Edge; spi_init.SPI_CPOL = SPI_CPOL_Low; spi_init.SPI_FirstBit = SPI_FirstBit_MSB; spi_init.SPI_Direction = SPI_Direction_2Lines_FullDuplex; spi_init.SPI_NSS = SPI_NSS_Hard; SPI_Init(SPI2, &spi_init); SPI_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE); SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Reset); SPI_Cmd(SPI2, ENABLE); GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); DMA_DeInit(DMA1_Stream3); dma_init.DMA_Channel = DMA_Channel_0; dma_init.DMA_DIR = DMA_DIR_PeripheralToMemory; dma_init.DMA_FIFOMode = DMA_FIFOMode_Disable; dma_init.DMA_Mode = DMA_Mode_Normal; dma_init.DMA_Priority = DMA_Priority_High; dma_init.DMA_Memory0BaseAddr = (uint32_t)&data; dma_init.DMA_MemoryInc = DMA_MemoryInc_Enable; dma_init.DMA_MemoryBurst = DMA_MemoryBurst_Single; dma_init.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; dma_init.DMA_PeripheralBaseAddr = (uint32_t)(SPI2_BASE + 0x0C); dma_init.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; dma_init.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_Init(DMA1_Stream3, &dma_init); DMA_Cmd(DMA1_Stream3, ENABLE); } В чем может быть ошибка?
×
×
  • Создать...