Здравствуйте.
Пишу прогу которая должна работать с внешним АЦП по SPI. Ему нужно дать 64 клока, MOSI использую для генерации импульса старта. То есть я отправляю по SPI 4 16битных слова, первый - 0xffff, остальные 0x0000. Чем городить 4 прерывания по SPI для передачи лучше сделать передачу и прием буферов через DMA. На основе примера SPI_RAM сделал свой код:
CODE
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel2);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1_BASE;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_SPI_DMA_RX_Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = ADC_SPI_DMA_Buffer_size;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
DMA_DeInit(DMA1_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1_BASE;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_SPI_DMA_TX_Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
/* Enable SPI_MASTER DMA Tx request */
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
/* Enable SPI_MASTER DMA Rx request */
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel2, ENABLE);
DMA_Cmd(DMA1_Channel3, ENABLE);
while(!DMA_GetFlagStatus(DMA1_FLAG_TC2));
while(!DMA_GetFlagStatus(DMA1_FLAG_TC3));
DMA_Cmd(DMA1_Channel2, DISABLE);
DMA_Cmd(DMA1_Channel3, DISABLE);
return;
До return программа доходит, биты в регистрахстатуса DMA висит 0x770. То есть DMA считает что он передал и прянял в/из SPI. Но ноги SPI не дрыгаются, хотя если передать что то программно все работает.
Подскажите в чем проблема.