#define SPI_GLOBALS
/*******************************************************************************
* File Name : main.c
* Author : Wuhan R&D Center, Embest
* Date First Issued : 08/08/2008
* Description : Main program body
********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "spi.h"
/* Local includes ------------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
SPI_InitTypeDef SPI_InitStructure;
/*******************************************************************************
* Function Name : main
* Description : Main program
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Spi1_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// NVIC_InitTypeDef NVIC_InitStructure;
//使能GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO ,ENABLE);
/* Enable the USART3 Interrupt */
/* NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); */
/* Configure SPI1 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);
/* 从单片机请求数据输入线配置*/
/* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//从单片机1和2数据上传请求
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure); */
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//语音单片机数据上传请求
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IPU上拉输入 GPIO_Mode_IPD = 0x28//下拉输入 GPIO_Mode_IN_FLOATING = 0x04, //悬空输入
//GPIO_Init(GPIOA, &GPIO_InitStructure);
/* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//语音单片机数据上传请求
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IPU上拉输入 GPIO_Mode_IPD = 0x28//下拉输入 GPIO_Mode_IN_FLOATING = 0x04, //悬空输入
GPIO_Init(GPIOC, &GPIO_InitStructure); */
/* 1st phase: SPI1 Master and SPI2 Slave */
/* SPI1 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_Low;//SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//SPI_CPHA_2Edge; /**************/*/*/*/*/*/*/*/*/*/*/*//*/*/*/*/*/*/*/
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
// SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //72M/32=2.25M
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //25M/4=6.25M
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
/* Enable SPI_MASTER RXNE interrupt */
// SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
//使用定时2通道1中断发送SPI数据,不使用SPI发送空中断,每20us发送一字节数据,折合波特率为50K
/* Enable SPI_MASTER TXE interrupt */
//SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_TXE, ENABLE);
}
/*******************************************************************************
* Function Name : Buffercmp
* Description : Uartpares two buffers.
* Input : - pBuffer1, pBuffer2: buffers to be Uartpared.
* : - BufferLength: buffer's length
* Output : None
* Return : PASSED: pBuffer1 identical to pBuffer2
* FAILED: pBuffer1 differs from pBuffer2
*******************************************************************************/
/*
BitAction Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength)
{
while(BufferLength--)
{
if(*pBuffer1 != *pBuffer2)
{
return Bit_RESET;
}
pBuffer1++;
pBuffer2++;
}
return Bit_SET;
}
*/
//配送电话01058697789
//开始读从SPI数据
/*
void StartSpiToSpi(void)
{
//建立SPI数据包头
SpiToSpiSending=1; //开始SPI到SPI发送数据
SpiToSpiSendLength=3; //发送数据长度
SpiSending_1ms=0; //SPI发送数据时间计数器
CCR1_Val = SPI_Send_Space_20us; //定时器2通道1每20uS中断1次(发送SPI数据1字节)
}
//开始转发串口数据
void StartUartToSpi(void)
{
UartToSpiSendStartFlag=0;
SpiSending_1ms=0;
CCR1_Val = SPI_Send_Space_20us; //定时器2通道1每20uS中断1次(发送SPI数据1字节)
UartToSpiSending=1; //串口向SPI正在发送数据
}
*/
//选择SPI第1从单片机(串口6和串口7)
/*
void SlectSlave1(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); // Enable the FSMC Clock,Write/read to/from FSMC SRAM memory
//停止选择其他SPI
LATCH1_Set(LATCH1_SS2 | LATCH1_SS3 | LATCH1_MISO_SEL2 | LATCH1_MISO_SEL3);
//选中本SPI
LATCH1_Clr(LATCH1_SS1 | LATCH1_MISO_SEL1); //选择SS1和MISO_SEL1
SPI_SlectNumber=1; //SPI选中编号1,2,3
}
//选择SPI第2从单片机(串口8和串口9)
void SlectSlave2(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); // Enable the FSMC Clock,Write/read to/from FSMC SRAM memory
//停止选择其他SPI
LATCH1_Set(LATCH1_SS1 | LATCH1_SS3 | LATCH1_MISO_SEL1 | LATCH1_MISO_SEL3);
//选中本SPI
LATCH1_Clr(LATCH1_SS2 | LATCH1_MISO_SEL2); //选择SS2和MISO_SEL2
SPI_SlectNumber=2; //SPI选中编号1,2,3
}
//选择SPI第3从单片机(与语音单片机通讯,对应串口0))
void SlectSlave3(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); // Enable the FSMC Clock,Write/read to/from FSMC SRAM memory
//停止选择其他SPI
LATCH1_Set(LATCH1_SS1 | LATCH1_SS2 | LATCH1_MISO_SEL1 | LATCH1_MISO_SEL2);
//选中本SPI
LATCH1_Clr(LATCH1_SS3 | LATCH1_MISO_SEL3); //选择SS3和MISO_SEL3
SPI_SlectNumber=3; //SPI选中编号1,2,3
}
*/
//spi系统控制
#if 0
void spi_ctrl(void)
{
u8 RecCounter;
// u8 temp;
// struct_Uart_BUF *P_Uart;
//SPI相关时间计数器处理
if (SPI_1ms!=0){
SPI_1ms--;
UartRecSpace_1ms++; //串口接收数据间隔计数器
SpiSending_1ms++;
}
if (UartLoopTestFlag==1){ //超级终端已处理回环
if (Uart6.RecSpiReadPoint!=Uart6.RecBufWritePoint){
Uart6.SendBuf[Uart6.SendBufWritePoint++]=Uart6.RecBuf[Uart6.RecSpiReadPoint++];
}
if (Uart7.RecSpiReadPoint!=Uart7.RecBufWritePoint){
Uart7.SendBuf[Uart7.SendBufWritePoint++]=Uart7.RecBuf[Uart7.RecSpiReadPoint++];
}
if (Uart8.RecSpiReadPoint!=Uart8.RecBufWritePoint){
Uart8.SendBuf[Uart8.SendBufWritePoint++]=Uart8.RecBuf[Uart8.RecSpiReadPoint++];
}
if (Uart9.RecSpiReadPoint!=Uart9.RecBufWritePoint){
Uart9.SendBuf[Uart9.SendBufWritePoint++]=Uart9.RecBuf[Uart9.RecSpiReadPoint++];
}
}
*/
//如果SPI没有发送数据,检查是否有新的数据在发送
if((UartToSpiSending==0)&&(SpiToSpiSending==0)){
//串口6向SPI转发数据分析,如果现在没有转发数据,检查是否达到转发条件
if (Uart6.SendBufReadPoint!=Uart6.SendBufWritePoint)
{
RecCounter=Uart6.SendBufWritePoint-Uart6.SendBufReadPoint;
//如果接收数据大于4或接收间隔大于1毫秒 设置从SPI有数据要发送
if ((RecCounter>=8) || ((RecCounter!=0)&&(UartRecSpace_1ms>2))) {
UartToSpiDataLength=RecCounter;
P_UartToSpi=&
评论0