ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
557555 Топик полностью
framer (04.11.2014 17:15, просмотров: 218) ответил Apтём на Пытаюсь запустить передачу данных по SPI на STM32F4 - не получается.
вот рабочий пример. 

#include "agg240064_interface.h"
#include "pin.h"
#include "stm32f4xx_spi.h"

#define GRAPH_IRQ_PRIORITY 15

static Pin_T pinSDA = { .port = GPIOB, .pin = GPIO_Pin_5 };
static Pin_T pinSCK = { .port = GPIOB, .pin = GPIO_Pin_3 };
static Pin_T pinCD = { .port = GPIOB, .pin = GPIO_Pin_4 };
static Pin_T pinCS = { .port = GPIOC, .pin = GPIO_Pin_12 };
static Pin_T pinRST = { .port = GPIOD, .pin = GPIO_Pin_2 };



#define s_SPI                           SPI1
#define s_SPI_CLK                       RCC_APB2Periph_SPI1
#define s_SPI_CLK_INIT                  RCC_APB2PeriphClockCmd

#define s_SPI_SCK_PIN                   GPIO_Pin_3
#define s_SPI_SCK_GPIO_PORT             GPIOB
#define s_SPI_SCK_GPIO_CLK              RCC_AHB1Periph_GPIOB
#define s_SPI_SCK_SOURCE                GPIO_PinSource3
#define s_SPI_SCK_AF                    GPIO_AF_SPI1


#define s_SPI_MOSI_PIN                  GPIO_Pin_5
#define s_SPI_MOSI_GPIO_PORT            GPIOB
#define s_SPI_MOSI_GPIO_CLK             RCC_AHB1Periph_GPIOB
#define s_SPI_MOSI_SOURCE               GPIO_PinSource5
#define s_SPI_MOSI_AF                   GPIO_AF_SPI1

#define s_CS_PIN                        GPIO_Pin_12
#define s_CS_GPIO_PORT                  GPIOB
#define s_CS_GPIO_CLK                   RCC_AHB1Periph_GPIOB


#define SPI_PORT_TX_DMA_CHANNEL            DMA_Channel_3
#define SPI_PORT_TX_DMA_STREAM             DMA2_Stream3
#define SPI_PORT_DMA                       DMA2
#define SPI_PORT_DMAx_CLK                  RCC_AHB1Periph_DMA2
#define SPI_PORT_DMA_TX_IRQHandler         DMA2_Stream3_IRQHandler
#define SPI_PORT_DMA_TX_IRQn               DMA2_Stream3_IRQn

static void spi_init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  DMA_InitTypeDef DMA_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  s_SPI_CLK_INIT(s_SPI_CLK, ENABLE);
  RCC_AHB1PeriphClockCmd(SPI_PORT_DMAx_CLK, ENABLE);

  RCC_AHB1PeriphClockCmd(s_SPI_SCK_GPIO_CLK |
                         s_SPI_MOSI_GPIO_CLK | s_CS_GPIO_CLK, ENABLE);

  /*!< SPI pins configuration *************************************************/

  /*!< Connect SPI pins to AF5 */
  GPIO_PinAFConfig(s_SPI_SCK_GPIO_PORT, s_SPI_SCK_SOURCE, s_SPI_SCK_AF);
  //GPIO_PinAFConfig(s_SPI_MISO_GPIO_PORT, s_SPI_MISO_SOURCE, s_SPI_MISO_AF);
  GPIO_PinAFConfig(s_SPI_MOSI_GPIO_PORT, s_SPI_MOSI_SOURCE, s_SPI_MOSI_AF);

  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_DOWN;
  GPIO_InitStructure.GPIO_Pin = s_SPI_SCK_PIN;
  GPIO_Init(s_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin =  s_SPI_MOSI_PIN;
  GPIO_Init(s_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);


  /*!< Configure  Card CS pin in output pushpull mode ********************/
  GPIO_InitStructure.GPIO_Pin = s_CS_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(s_CS_GPIO_PORT, &GPIO_InitStructure);


  SPI_I2S_DeInit (s_SPI);
  SPI_StructInit (&SPI_InitStructure);
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_Init(s_SPI, &SPI_InitStructure);
  SPI_Cmd(s_SPI, ENABLE);


  DMA_DeInit(SPI_PORT_TX_DMA_STREAM);
  while (DMA_GetCmdStatus (SPI_PORT_TX_DMA_STREAM) != DISABLE);
  DMA_StructInit(&DMA_InitStructure);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (s_SPI->DR);
  DMA_InitStructure.DMA_Channel = SPI_PORT_TX_DMA_CHANNEL;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_Memory0BaseAddr = 0;
  DMA_InitStructure.DMA_BufferSize =1 ;
  DMA_Init(SPI_PORT_TX_DMA_STREAM, &DMA_InitStructure);
  DMA_ITConfig(SPI_PORT_TX_DMA_STREAM, DMA_IT_TC, ENABLE);


  NVIC_InitStructure.NVIC_IRQChannel = SPI_PORT_DMA_TX_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = GRAPH_IRQ_PRIORITY;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init (&NVIC_InitStructure);

  // Enable dma tx request.
  SPI_I2S_DMACmd (s_SPI, SPI_I2S_DMAReq_Tx, ENABLE);
}


void SPI_PORT_DMA_TX_IRQHandler() {
	if (DMA_GetITStatus(SPI_PORT_TX_DMA_STREAM, DMA_IT_TCIF3)) {
		DMA_ClearITPendingBit(SPI_PORT_TX_DMA_STREAM, DMA_IT_TCIF3);
	}
}


void AGG240064_interaface_init() {
	pin_config(&pinCD, GPIO_Mode_OUT, 0, GPIO_OType_PP, GPIO_Speed_50MHz);
	pin_config(&pinRST, GPIO_Mode_OUT, 0, GPIO_OType_PP, GPIO_Speed_50MHz);

	spi_init();
	pin_write(&pinRST, 1);

}

void AGG240064_interaface_reset(uint8_t value) {
	pin_write(&pinRST, value);
}


void AGG240064_interaface_write_buffer(uint8_t *buf, uint16_t len) {
	pin_write(&pinCD, 1);
	pin_write(&pinCS, 1);

	while (SPI_I2S_GetFlagStatus(s_SPI, SPI_I2S_FLAG_TXE) == RESET) { };
	while (SPI_I2S_GetFlagStatus(s_SPI, SPI_I2S_FLAG_BSY) == SET) { };

	SPI_PORT_TX_DMA_STREAM->NDTR = (uint32_t) len;
	SPI_PORT_TX_DMA_STREAM->M0AR = (uint32_t) buf;
	DMA_Cmd(SPI_PORT_TX_DMA_STREAM, ENABLE);
}