| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 | 
							- /******************************************************************************
 
-  * SPI Driver
 
-  * Copyright 2014, 海华电子企业(中国)有限公司.
 
-  *
 
-  * File Name  : Spi.c
 
-  * Description: SPI hardware Driver Functions
 
-  *
 
-  * modification history
 
-  * --------------------
 
-  * V1.0, 13-jun-2014, 梁广文 written
 
-  * --------------------
 
-  ******************************************************************************/
 
- #include <stdio.h>
 
- #include "hw_cfg.h"
 
- #include "spi.h"
 
- #ifdef SPI_USE_DMA
 
- static u8 dummy = 0xFF;
 
- /******************************************************************************
 
-  * SPI_DMARxConfig - SPI DMA配置
 
-  *
 
-  * Input:
 
-  * Output:
 
-  * modification history
 
-  * --------------------
 
-  * 13-jun-2014, 梁广文 written
 
-  * --------------------
 
-  ******************************************************************************/
 
- static void SPI_DMARxConfig(void *send_addr, void *recv_addr, u32 size)
 
- {
 
- 	DMA_InitTypeDef DMA_InitStructure;
 
- 	/* Reset DMA channel registers (for debug purpose) */
 
- 	DMA_DeInit(DMA1_Channel2);
 
- 	DMA_DeInit(DMA1_Channel3);
 
- 	/* Configure DMA_RX channel */
 
- 	DMA_Cmd(DMA1_Channel2, DISABLE);
 
- 	/* fill init structure */
 
- 	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_VeryHigh;
 
- 	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 
- 	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI1->DR));
 
- 	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
 
- 	DMA_InitStructure.DMA_BufferSize = (uint32_t)size;
 
- 	if(recv_addr != NULL)
 
- 	{
 
- 		DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) recv_addr;
 
- 		DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
 
- 	}
 
- 	else
 
- 	{
 
- 		DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) (&dummy);
 
- 		DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
 
- 	}
 
- 	DMA_Init(DMA1_Channel2, &DMA_InitStructure);
 
- //	DMA_ITConfig(DMA1_Channel2, DMA_IT_TC | DMA_IT_TE, ENABLE);
 
- 	DMA_ClearFlag(DMA1_FLAG_TC2);
 
- 	DMA_Cmd(DMA1_Channel2, ENABLE);
 
- 	/* Configure DMA_TX channel */
 
- 	DMA_Cmd(DMA1_Channel3, DISABLE);
 
- 	/* fill init structure */
 
- 	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_VeryHigh;
 
- 	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 
- 	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(spi_dev->SPI->DR));
 
- 	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
 
- 	DMA_InitStructure.DMA_BufferSize = (spi_dev)size;
 
- 	if(send_addr != NULL)
 
- 	{
 
- 		DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) send_addr;
 
- 		DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
 
- 	}
 
- 	else
 
- 	{
 
- 		dummy = 0xFF;
 
- 		DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) (&dummy);
 
- 		DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
 
- 	}
 
- 	DMA_Init(DMA1_Channel3, &DMA_InitStructure);
 
- //	DMA_ITConfig(DMA1_Channel3, DMA_IT_TC | DMA_IT_TE, ENABLE);
 
- 	DMA_ClearFlag(DMA1_FLAG_TC3);
 
- 	DMA_Cmd(DMA1_Channel3, ENABLE);
 
- }
 
- #endif
 
- /******************************************************************************
 
-  * SPI_Config - SPI及片选引脚初始化
 
-  *
 
-  * Input:
 
-  * Output:
 
-  * modification history
 
-  * --------------------
 
-  * 25-jul-2013, 梁广文 written
 
-  * --------------------
 
-  ******************************************************************************/
 
- void SPI_Config(void)
 
- {
 
- 	GPIO_InitTypeDef  GPIO_InitStructure;
 
-  	SPI_InitTypeDef   SPI_InitStructure;
 
- 	/* GPIOA and GPIOC Periph clock enable */
 
- 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 
- 	/* SPI Periph clock enable */
 
- 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
 
- 	/* Configure SPI pins: SCK, MISO and MOSI */
 
- 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
 
- 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
- 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 
- 	GPIO_Init(GPIOA, &GPIO_InitStructure);
 
- 	/* SPI Config */
 
- 	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
 
- 	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
 
- 	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
 
- 	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
 
- 	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
 
- 	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
 
- 	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
 
- 	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
 
- 	SPI_InitStructure.SPI_CRCPolynomial = 7;
 
- 	SPI_Init(SPI1, &SPI_InitStructure);
 
- 	/* SPI enable */
 
- 	SPI_Cmd(SPI1, ENABLE);
 
- }
 
- /******************************************************************************
 
-  * SPI_Xfer - SPI读写
 
-  *
 
-  * Input: -Data
 
-  * Output:
 
-  * modification history
 
-  * --------------------
 
-  * 13-jun-2014, 梁广文 written
 
-  * --------------------
 
-  ******************************************************************************/
 
- u32 SPI_Xfer(SPI_CS_t spi_cs, SPI_Message_t *message)
 
- {
 
- 	u32 size = message->len;
 
- 	/* take CS */
 
- 	if(message->cs_take)
 
- 		GPIO_ResetBits(spi_cs.GPIOx, spi_cs.GPIO_Pin);
 
- #ifdef SPI_USE_DMA
 
- 	if(message->len > 32)
 
- 	{
 
- 		SPI_DMARxConfig(message->send_buf, message->recv_buf, message->length);
 
- //		SPI_I2S_ClearFlag(SPI, SPI_I2S_FLAG_RXNE);
 
- 		SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx | SPI_I2S_DMAReq_Rx, ENABLE);
 
- 		while (DMA_GetFlagStatus(DMA1_FLAG_TC2) == RESET
 
- 			|| DMA_GetFlagStatus(DMA1_FLAG_TC3) == RESET);
 
- 		SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx | SPI_I2S_DMAReq_Rx, DISABLE);
 
- 	}
 
- 	else
 
- #endif
 
- 	{
 
- 		u8 *psend = message->send_buf;
 
- 		u8 *precv = message->recv_buf;
 
- 		while(size--)
 
- 		{
 
- 			u8 tmp = 0xFF;
 
- 			if(psend != NULL)
 
- 				tmp = *psend++;
 
- 			//Wait until the transmit buffer is empty, then send the byte.
 
- 			while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
 
- 			SPI_I2S_SendData(SPI1, tmp);
 
- 			//Wait until a data is received, get the received data
 
- 			while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
 
- 			tmp = SPI_I2S_ReceiveData(SPI1);
 
- 			if(precv != NULL)
 
- 				*precv++ = tmp;
 
- 		}
 
- 	}
 
- 	/* release CS */
 
- 	if(message->cs_release)
 
- 		GPIO_SetBits(spi_cs.GPIOx, spi_cs.GPIO_Pin);
 
- 	return message->len;
 
- }
 
- /******************************************************************************
 
-  * SPI_SendThenSend - SPI发送写命令后发送数据
 
-  *
 
-  * Input:
 
-  * Output:
 
-  * modification history
 
-  * --------------------
 
-  * 13-jun-2014, 梁广文 written
 
-  * --------------------
 
-  ******************************************************************************/
 
- u32 SPI_SendThenSend(SPI_CS_t spi_cs, void *send1_buf,u32 send1_size, void *send2_buf,u32 send2_size)
 
- {
 
- 	SPI_Message_t message;
 
- 	/*send data1*/
 
- 	message.send_buf = send1_buf;
 
- 	message.recv_buf = NULL;
 
- 	message.len = send1_size;
 
- 	message.cs_take = 1;
 
- 	message.cs_release = 0;
 
- 	if(SPI_Xfer(spi_cs, &message) == 0)
 
- 		return 0;
 
- 	/*send data2*/
 
- 	message.send_buf = send2_buf;
 
- 	message.recv_buf = NULL;
 
- 	message.len = send2_size;
 
- 	message.cs_take = 0;
 
- 	message.cs_release = 1;
 
- 	return SPI_Xfer(spi_cs, &message);
 
- }
 
- /******************************************************************************
 
-  * SPI_SendThenRecv - SPI发送读命令后接收数据
 
-  *
 
-  * Input:
 
-  * Output:
 
-  * modification history
 
-  * --------------------
 
-  * 13-jun-2014, 梁广文 written
 
-  * --------------------
 
-  ******************************************************************************/
 
- u32 SPI_SendThenRecv(SPI_CS_t spi_cs, void *send_buf,u32 send_size, void *recv_buf,u32 recv_size)
 
- {
 
- 	SPI_Message_t message;
 
- 	/*send data*/
 
- 	message.send_buf = send_buf;
 
- 	message.recv_buf = NULL;
 
- 	message.len = send_size;
 
- 	message.cs_take = 1;
 
- 	message.cs_release = 0;
 
- 	if(SPI_Xfer(spi_cs, &message) == 0)
 
- 		return 0;
 
- 	/* recv data */
 
- 	message.send_buf = NULL;
 
- 	message.recv_buf = recv_buf;
 
- 	message.len = recv_size;
 
- 	message.cs_take = 0;
 
- 	message.cs_release = 1;
 
- 	return SPI_Xfer(spi_cs, &message);
 
- }
 
- u32 SPI_Transfer(SPI_CS_t spi_cs, void *send_buf, u32 size)
 
- {
 
- 	SPI_Message_t message;
 
- 	/*send data*/
 
- 	message.send_buf = send_buf;
 
- 	message.recv_buf = NULL;
 
- 	message.len = size;
 
- 	message.cs_take = 1;
 
- 	message.cs_release = 1;
 
- 	return SPI_Xfer(spi_cs, &message);
 
- }
 
 
  |