реклама на сайте
подробности

 
 
> stm32f411 spi1+DMA, непрерывная выдача данных
Volldemar
сообщение Aug 31 2017, 12:24
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 27-04-09
Из: Украина
Пользователь №: 48 342



Привожу код что и как делаю, вопрос в том, что в прерывание ДМА входит, а вот уже в обработчике прерывания в if не входити ессно нет переключения между массивами, что не так?Надеюсь на конструктивный диалог, заранее спасибо.
Код
void DMA2_Stream5_IRQHandler ( void )
{
    uart2_putcharPoll ( 'I' );//, xNoBlock );

    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

    if ( DMA_GetITStatus ( SPI_DMA_MASTER_Tx_DMA_Stream, DMA_IT_TCIF5 ) == SET )
    {
        uart2_putcharPoll ( 'F' );//, xNoBlock );

//         Clear DMA Stream Transfer Complete interrupt pending bit

        if ( CurrentBufSPI1 == buf1 )
        {
            CurrentBufSPI1 = buf2;
            uart2_putcharPoll ( '2' );//, xNoBlock );
        }

        if ( CurrentBufSPI1 == buf2 )
        {
            CurrentBufSPI1 = buf1;
            uart2_putcharPoll ( '1' );//, xNoBlock );
        }
        DMA_Cmd ( SPI_DMA_MASTER_Tx_DMA_Stream, DISABLE );
        DMA_ClearITPendingBit ( SPI_DMA_MASTER_Tx_DMA_Stream, DMA_IT_TCIF5 );
    }
    xSemaphoreGiveFromISR ( xSemaphore_spi1, &xHigherPriorityTaskWoken );
    xTaskResumeFromISR (&xHandleSPI1);
    uart2_putcharPoll ( 'E' );//, xNoBlock );
    portEND_SWITCHING_ISR ( xHigherPriorityTaskWoken );
}


Код
void Task_SPI1 ( void *pvParameters )
{
    xSemaphoreTake ( xSemaphore_spi1, portMAX_DELAY );

    for (;; )
    {
        if ( CurrentBufSPI1 == buf1 )
        {
            ukladkabufTXSPI1 ( Buffer1TX_SPI1 );

            DMA_Config ( Buffer1TX_SPI1, indexTX*8 );
        }
        if ( CurrentBufSPI1 == buf2 )
                {
            ukladkabufTXSPI1 ( Buffer2TX_SPI1 );

            DMA_Config ( Buffer2TX_SPI1, indexTX*8 );
        }
            vTaskSuspend ( &xHandleSPI1 );

    }
}

Код
[/code]void DMA_Config ( uint8_t * Memory0BaseAddr, uint16_t size )
{
    DMA_InitTypeDef        DMA_InitStructure;
    NVIC_InitTypeDef    NVIC_InitStructure;

    // Сброс настроек DMA каналов
    DMA_DeInit ( SPI_DMA_MASTER_Tx_DMA_Stream );

    RCC_AHB1PeriphClockCmd ( SPI_DMA_MASTER_DMA_CLK, ENABLE );

    DMA_DeInit(SPIx_TX_DMA_STREAM);
    /* Configure DMA Initialization Structure */
      DMA_InitStructure.DMA_BufferSize = size;
      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
      DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) (&(SPIx->DR));
      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
      DMA_InitStructure.DMA_Priority = DMA_Priority_High;
      /* Configure TX DMA */
      DMA_InitStructure.DMA_Channel = SPIx_TX_DMA_CHANNEL;
      DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
      DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)Memory0BaseAddr;
      DMA_Init(SPIx_TX_DMA_STREAM, &DMA_InitStructure);

    // Configure the DMA interrupt priority
    NVIC_InitStructure.NVIC_IRQChannel = DMAx_Streamx_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init ( &NVIC_InitStructure );

    SPI_I2S_ITConfig ( SPIx, SPI_I2S_IT_TXE, ENABLE );

    DMA_ClearITPendingBit ( SPI_DMA_MASTER_Tx_DMA_Stream, SPI_DMA_MASTER_Tx_DMA_IT );
    DMA_ClearFlag ( SPI_DMA_MASTER_Tx_DMA_Stream, SPI_DMA_MASTER_Tx_DMA_FLAG );

    SPI_I2S_DMACmd ( SPI_DMA_MASTER, SPI_I2S_DMAReq_Tx, ENABLE );
    DMA_ITConfig ( SPI_DMA_MASTER_Tx_DMA_Stream, DMA_IT_TC, ENABLE );
    DMA_Cmd ( SPI_DMA_MASTER_Tx_DMA_Stream, ENABLE );
}


знаю есть режим дабл-буфер в f411, но как его заюзать на SPL?
дефайны:
Код
#define SPI_DMA_MASTER                    SPI1
#define SPI_DMA_MASTER_DMA                DMA2
#define SPI_DMA_MASTER_DMA_CLK            RCC_AHB1Periph_DMA2
#define SPI_DMA_MASTER_Tx_DMA_Stream    DMA2_Stream5
#define SPI_DMA_MASTER_Tx_DMA_Channel    DMA_Channel_3
#define SPI_DMA_MASTER_Tx_DMA_FLAG        DMA_FLAG_TCIF5
#define SPI_DMA_MASTER_Tx_DMA_IT        DMA_IT_TCIF5
#define DMAx_Streamx_IRQn                DMA2_Stream5_IRQn

#define SPIx_DMA                        DMA2
#define SPIx_DMA_CLK                    RCC_AHB1Periph_DMA2
#define SPIx_TX_DMA_CHANNEL             DMA_Channel_3
#define SPIx_TX_DMA_STREAM              DMA2_Stream5
#define SPIx_TX_DMA_FLAG_TCIF           DMA_FLAG_TCIF5


Сообщение отредактировал Volldemar - Aug 31 2017, 12:53
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Hold
сообщение Sep 4 2017, 10:32
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 27-01-17
Пользователь №: 95 184



У себя делал так, на STM32F4x9:
CODE

#include "globals.h"
#include "SPIRoutines.h"


static uint8_t RxDummy;
static uint8_t TxDummy;

static xSemaphoreHandle MEM_Complete;
static xSemaphoreHandle SpiBusy;

static DMA_InitTypeDef DMA_InitStructure;


_SPI_CS_PIN_STRUCT CS_DevList[] = {
{ "FLASH", GPIO_Pin_14, GPIOC, RCC_AHB1Periph_GPIOC },
{ "FRAM 1", GPIO_Pin_3, GPIOE, RCC_AHB1Periph_GPIOE },
{ "FRAM 2", GPIO_Pin_4, GPIOE, RCC_AHB1Periph_GPIOE },
{ "FRAM 3", GPIO_Pin_13, GPIOC, RCC_AHB1Periph_GPIOC },
{ "FRAM 4", GPIO_Pin_8, GPIOI, RCC_AHB1Periph_GPIOI },

};

void InitSPI4(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;


// Тактирование модуля SPI, портов, DMA
RCC_AHB1PeriphClockCmd(SPI_EXT_MEM_GPIO_RCC, ENABLE);
RCC_APB2PeriphClockCmd(SPI_EXT_MEM_RCC, ENABLE);
RCC_AHB1PeriphClockCmd(SPI_EXT_MEM_DMA_CLK, ENABLE);

//Настроим порты
GPIO_InitStructure.GPIO_Pin = SPI_EXT_MEM_SCK | SPI_EXT_MEM_MOSI | SPI_EXT_MEM_MISO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(SPI_EXT_MEM_GPIO, &GPIO_InitStructure);

GPIO_PinAFConfig(SPI_EXT_MEM_GPIO ,GPIO_PinSource2 ,GPIO_AF_SPI4 );
GPIO_PinAFConfig(SPI_EXT_MEM_GPIO ,GPIO_PinSource5 ,GPIO_AF_SPI4 );
GPIO_PinAFConfig(SPI_EXT_MEM_GPIO ,GPIO_PinSource6 ,GPIO_AF_SPI4 );


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

for (uint8_t i = 0; i < SPI_EXT_MEM_NUM_CS; i++)
{
RCC_AHB1PeriphClockCmd( CS_DevList[i].Rcc, ENABLE);
GPIO_InitStructure.GPIO_Pin = CS_DevList[i].Pin;
GPIO_Init(CS_DevList[i].Port, &GPIO_InitStructure);
SPI_CS_High((List_CsDev)i);
}

//Заполняем структуру с параметрами SPI модуля
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // полный дуплекс
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // передаем по 8 бит
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // Полярность и
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // фаза тактового сигнала
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // Управлять состоянием сигнала NSS программно
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; // Предделитель SCK (APB2 90 MHz)
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // Первым отправляется старший бит
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // Режим - мастер
SPI_Init(SPI_EXT_MEM, &SPI_InitStructure); // Настраиваем SPI1
// SPI_Cmd(SPI_EXT_MEM, ENABLE); // Включаем модуль

SPI_NSSInternalSoftwareConfig(SPI_EXT_MEM, SPI_NSSInternalSoft_Set);

SPI_I2S_DMACmd(SPI_EXT_MEM, SPI_I2S_DMAReq_Rx, ENABLE);
SPI_I2S_DMACmd(SPI_EXT_MEM, SPI_I2S_DMAReq_Tx, ENABLE);

//настройка прерываний DMA
//Прерывания только по Rx, когда байт уже ушел
NVIC_InitStructure.NVIC_IRQChannel = SPI_EXT_MEM_Rx_DMA_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = SPI_EXT_MEM_Rx_DMA_IRQ_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.DMA_Channel = SPI_EXT_MEM_DMA_Channel;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI_EXT_MEM->DR;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

vSemaphoreCreateBinary(MEM_Complete);
xSemaphoreTake(MEM_Complete, 0);

SpiBusy = xSemaphoreCreateMutex();
}

void SPI4_SetDMA_RxTx(uint32_t MemAddr ,uint16_t NumByte ,List_DMA_Mode Mode )
{
xSemaphoreTake(SpiBusy, portMAX_DELAY);

DMA_DeInit(SPI_EXT_MEM_Rx_DMA_Stream);
DMA_DeInit(SPI_EXT_MEM_Tx_DMA_Stream);


DMA_InitStructure.DMA_BufferSize = NumByte;
if (Mode == DMA_MODE_TX || Mode == DMA_MODE_TX_FILL)
{
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&RxDummy; //при записи пишем в переменную-пустышку без инкремента
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_Init(SPI_EXT_MEM_Rx_DMA_Stream, &DMA_InitStructure);

DMA_InitStructure.DMA_Memory0BaseAddr = MemAddr;
if (Mode == DMA_MODE_TX) DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
else DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_Init(SPI_EXT_MEM_Tx_DMA_Stream, &DMA_InitStructure);
}
else
{
DMA_InitStructure.DMA_Memory0BaseAddr = MemAddr;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_Init(SPI_EXT_MEM_Rx_DMA_Stream, &DMA_InitStructure);

DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&TxDummy; //при чтении передаем переменную-пустышку без инкремента
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_Init(SPI_EXT_MEM_Tx_DMA_Stream, &DMA_InitStructure);
}
DMA_ITConfig(SPI_EXT_MEM_Rx_DMA_Stream, DMA_IT_TC, ENABLE);

DMA_Cmd(SPI_EXT_MEM_Rx_DMA_Stream, ENABLE); // Запускаем на прием
DMA_Cmd(SPI_EXT_MEM_Tx_DMA_Stream, ENABLE); // Запускаем на передачу
SPI_Cmd(SPI_EXT_MEM, ENABLE); // Включаем модуль (для одновременного старта RX/TX)

xSemaphoreTake(MEM_Complete, portMAX_DELAY); // Ждем пока отработает

while (DMA_GetCmdStatus(SPI_EXT_MEM_Tx_DMA_Stream) != DISABLE);
while (DMA_GetCmdStatus(SPI_EXT_MEM_Rx_DMA_Stream) != DISABLE);
SPI_Cmd(SPI_EXT_MEM, DISABLE); // Выключаем модуль

xSemaphoreGive(SpiBusy);
}

//Завершение чтения(а оно возникает только после полной записи) DMA
void DMA2_Stream0_IRQHandler(void)
{
static portBASE_TYPE xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;

if (DMA_GetITStatus(SPI_EXT_MEM_Rx_DMA_Stream ,SPI_EXT_MEM_Rx_DMA_FLAG ))
{
DMA_ClearITPendingBit(SPI_EXT_MEM_Rx_DMA_Stream, SPI_EXT_MEM_Rx_DMA_FLAG);

xSemaphoreGiveFromISR(MEM_Complete ,&xHigherPriorityTaskWoken );
if( xHigherPriorityTaskWoken == pdTRUE ) taskYIELD();
}
}

void SPI_CS_Low(List_CsDev Device)
{
asm("nop");
GPIO_ResetBits(CS_DevList[Device].Port, CS_DevList[Device].Pin);
asm("nop");
}

void SPI_CS_High(List_CsDev Device)
{
asm("nop");
GPIO_SetBits(CS_DevList[Device].Port, CS_DevList[Device].Pin);
asm("nop");
}


CODE

#ifndef SPI_ROUTINES_H
#define SPI_ROUTINES_H

#define SPI_EXT_MEM SPI4
#define SPI_EXT_MEM_RCC RCC_APB2Periph_SPI4

#define SPI_EXT_MEM_GPIO GPIOE
#define SPI_EXT_MEM_GPIO_RCC RCC_AHB1Periph_GPIOE
#define SPI_EXT_MEM_SCK GPIO_Pin_2
#define SPI_EXT_MEM_MISO GPIO_Pin_5
#define SPI_EXT_MEM_MOSI GPIO_Pin_6

#define SPI_EXT_MEM_NUM_CS 5


#define SPI_EXT_MEM_DMA_CLK RCC_AHB1Periph_DMA2
#define SPI_EXT_MEM_DMA_Channel DMA_Channel_4
#define SPI_EXT_MEM_Rx_DMA_Stream DMA2_Stream0
#define SPI_EXT_MEM_Tx_DMA_Stream DMA2_Stream1

#define SPI_EXT_MEM_Rx_DMA_IRQ DMA2_Stream0_IRQn
#define SPI_EXT_MEM_Rx_DMA_FLAG DMA_IT_TCIF0
#define SPI_EXT_MEM_Rx_DMA_IRQ_PRIORITY 15

typedef enum
{
EXT_MEM_FLASH = 0, // AT45DB641E
EXT_MEM_FRAM1,
EXT_MEM_FRAM2,
EXT_MEM_FRAM3,
EXT_MEM_FRAM4,
}List_CsDev;

typedef struct
{
const uint8_t *Str;
uint16_t Pin;
GPIO_TypeDef *Port;
uint32_t Rcc;
} _SPI_CS_PIN_STRUCT;

typedef enum
{
DMA_MODE_RX=1, // читаем данные
DMA_MODE_TX, // пишем данные
DMA_MODE_TX_FILL, // Заполняем одним и тем же
}List_DMA_Mode;

extern void InitSPI4(void);

extern void SPI_CS_Low(List_CsDev Device);
extern void SPI_CS_High(List_CsDev Device);

extern void SPI4_SetDMA_RxTx(uint32_t MemAddr ,uint16_t NumByte ,List_DMA_Mode Mode );




extern _SPI_CS_PIN_STRUCT CS_DevList[];

#endif




Для чтения/записи в нужный CS необходимо лишь:
Код
        SPI_CS_Low(EXT_MEM_FLASH);
        SPI4_SetDMA_RxTx((uint32_t)TxBuf, 1,DMA_MODE_TX);
        SPI4_SetDMA_RxTx((uint32_t)RxBuf, 9,DMA_MODE_RX);
        SPI_CS_High(EXT_MEM_FLASH);

Естественно вызывать только из тасков FreeRTOS, т.е. используется ожидания завершения передачи через семафор.

В вашем прерывании нет необходимости вызывать:
Код
DMA_Cmd ( SPI_DMA_MASTER_Tx_DMA_Stream, DISABLE );

Т.к. Stream автоматически выключается после окончания передачи, что явно указано в ДШ:
Прикрепленное изображение


UPD:
И еще важная мелочь - т.к. вы используете только Tx на DMA, фактически, прерывание не гарантирует того, что все данные вышли с MOSI-линии. Это значит лишь то, что DMA закончил работу, и переправил все байты в регистр данных SPI, который буферизирован. Для однозначного отслеживания окончания передачи следует дожидаться флага SPI_SR_BSY в статусном регистре SPI. Это не особо заметно на маленьких скоростях, но на больших это вылазит тут же. Помню долго голову ломал, почему , при снятии CS после срабатывания DMA прерывания по Tx, фактически на осциллографе CS снимался посередине последнего байта, естественно данные портились.

Сообщение отредактировал Hold - Sep 4 2017, 10:51
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 4 2017, 12:02
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Hold @ Sep 4 2017, 13:32) *
Для однозначного отслеживания окончания передачи следует дожидаться флага SPI_SR_BSY в статусном регистре SPI.
Несомненным достижением инженеров ST можно назвать отсутствие прерывания на этот флаг.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Hold
сообщение Sep 5 2017, 04:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 27-01-17
Пользователь №: 95 184



Цитата(Сергей Борщ @ Sep 4 2017, 19:02) *
Несомненным достижением инженеров ST можно назвать отсутствие прерывания на этот флаг.

Помню долго недоумевал, как же отслеживать окончание передачи только по Tx, используя прерывания. Была уже мысль включить Rx канал DMA, без физического подключения Rx, и работать по нему. Но руки так и не дошли.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Volldemar   stm32f411 spi1+DMA   Aug 31 2017, 12:24
- - AHTOXA   После if ( CurrentBufSPI1 == buf1 ) нужен else. Ин...   Aug 31 2017, 17:59
|- - Volldemar   Цитата(AHTOXA @ Aug 31 2017, 20:59) После...   Sep 1 2017, 06:06
|- - AHTOXA   Код#define SPI_DMA_MASTER_Tx_DMA_Channel DMA_Chann...   Sep 1 2017, 15:07
|- - Сергей Борщ   QUOTE (AHTOXA @ Sep 1 2017, 18:07) Вы зап...   Sep 1 2017, 15:43
|- - AHTOXA   А, точно, забыл уже, что там ещё один уровень доба...   Sep 1 2017, 19:47
- - adnega   Цитата(Volldemar @ Aug 31 2017, 15:24) На...   Sep 1 2017, 19:56
|- - Volldemar   Цитата(adnega @ Sep 1 2017, 22:56) Похоже...   Sep 4 2017, 05:58
|- - adnega   Цитата(Volldemar @ Sep 4 2017, 08:58) я о...   Sep 4 2017, 06:12
|- - Volldemar   Цитата(adnega @ Sep 4 2017, 09:12) А как ...   Sep 4 2017, 06:15
|- - adnega   Цитата(Volldemar @ Sep 4 2017, 09:15) нич...   Sep 4 2017, 06:58
|- - Volldemar   Цитата(adnega @ Sep 4 2017, 09:58) Вы исп...   Sep 4 2017, 07:19
|- - adnega   Цитата(Volldemar @ Sep 4 2017, 10:19) как...   Sep 4 2017, 08:29
|- - Volldemar   Цитата(adnega @ Sep 4 2017, 11:29) О, я р...   Sep 4 2017, 09:17
|- - Volldemar   [quote] Т.к. Stream автоматически выключается посл...   Sep 4 2017, 12:01
|- - Volldemar   Цитата(Сергей Борщ @ Sep 4 2017, 15:02) Н...   Sep 4 2017, 12:09
||- - jcxz   Цитата(Volldemar @ Sep 4 2017, 15:09) это...   Sep 4 2017, 16:54
|- - Сергей Борщ   QUOTE (Hold @ Sep 5 2017, 07:09) Была уже...   Sep 5 2017, 06:13
- - Hold   SPI, по сравнению с I2C, еще относительно безглючн...   Sep 5 2017, 06:29
|- - adnega   Цитата(Hold @ Sep 5 2017, 09:29) какой-то...   Sep 5 2017, 06:37
|- - jcxz   Цитата(Hold @ Sep 5 2017, 09:29) SPI, по ...   Sep 5 2017, 06:58
|- - Hold   Цитата(jcxz @ Sep 5 2017, 13:58) При отсу...   Sep 5 2017, 08:18
- - Volldemar   Ребят, канешна спасибо за инфу, очень пригодится в...   Sep 5 2017, 07:23
|- - adnega   Цитата(Volldemar @ Sep 5 2017, 10:23) Вот...   Sep 5 2017, 07:56
||- - Volldemar   Цитата(adnega @ Sep 5 2017, 10:56) Значит...   Sep 5 2017, 08:12
||- - adnega   Цитата(Volldemar @ Sep 5 2017, 11:12) в F...   Sep 5 2017, 08:41
||- - Volldemar   Цитата(adnega @ Sep 5 2017, 11:41) Вам ну...   Sep 5 2017, 08:48
||- - adnega   Цитата(Volldemar @ Sep 5 2017, 11:48) DMA...   Sep 5 2017, 09:44
|- - Сергей Борщ   QUOTE (Volldemar @ Sep 5 2017, 10:23) т.е...   Sep 5 2017, 08:41
|- - jcxz   Цитата(Сергей Борщ @ Sep 5 2017, 11:41) К...   Sep 5 2017, 12:58
- - Volldemar   Инит ДМА вот такой: Кодvoid DMA_Config ( uint8...   Sep 5 2017, 11:22
- - Hold   Как минимум, в функцию DMA_DoubleBufferModeConfig(...   Sep 5 2017, 12:18
|- - Volldemar   Цитата(Hold @ Sep 5 2017, 15:18) Как мини...   Sep 5 2017, 12:20
|- - Сергей Борщ   QUOTE (Volldemar @ Sep 5 2017, 15:20) выв...   Sep 5 2017, 12:26
- - Volldemar   даже если прописать: КодDMA_DoubleBufferModeConfig...   Sep 5 2017, 12:35
|- - Сергей Борщ   QUOTE (Volldemar @ Sep 5 2017, 15:35) даж...   Sep 5 2017, 13:04
|- - Aleksandr Baranov   Цитата(Volldemar @ Sep 5 2017, 08:35) так...   Sep 5 2017, 16:39
|- - Volldemar   Цитата(Aleksandr Baranov @ Sep 5 2017, 19...   Sep 6 2017, 08:02
- - Volldemar   Сергей Борщ - спасибо, внял вашему совету!...   Sep 5 2017, 13:10
- - Volldemar   Вроде зашевелилось!!! Появилась выдача...   Sep 6 2017, 11:43
- - Aleksandr Baranov   Цитата(Volldemar @ Sep 6 2017, 07:43) Поя...   Sep 6 2017, 12:14
- - jcxz   Цитата(Volldemar @ Sep 6 2017, 14:43) Поя...   Sep 7 2017, 19:36
- - Volldemar   Цитата(jcxz @ Sep 7 2017, 22:36) Если воп...   Sep 8 2017, 13:29
- - jcxz   Цитата(Volldemar @ Sep 8 2017, 20:29) как...   Sep 8 2017, 15:27


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 18:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016