新手上路
- 积分
- 42
- 金钱
- 42
- 注册时间
- 2020-3-30
- 在线时间
- 20 小时
|
1金钱
#include "stm32f4xx.h"
unsigned int cnt=0,flag=0;
unsigned char LensAbck[42]={
0x55,0x12,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xff};
unsigned char CmdTx[8]={0x55,0x00,0x00,0x00,0x00,0x00,0x00,0xff};
void SPI1_Tx_Buff(void);
void SPI1_init(void);
void SPI2_init(void);
void SPI2_Tx_Buff(void);
int main()
{
SPI2_init();
SPI1_init();
while(1)
{
SPI2_Tx_Buff();
SPI1_Tx_Buff();
}
}
void SPI1_init(void)
{
//SPI1 PB3,4,5 SPI1 SCK MISO MOSI
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
DMA_InitTypeDef DMA_InitStruct;
//时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
//IO口配置
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);
//SPI设置
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_Direction=SPI_Direction_1Line_Tx;
SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_LSB;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
SPI_InitStruct.SPI_CRCPolynomial=7;
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;
SPI_Init(SPI1,&SPI_InitStruct);
SPI_Cmd(SPI1,ENABLE);
//DMA设置 SPI1-TX——DMA2—Stream3-channel3 RX-DMA2-Stream2_channel2
DMA_DeInit(DMA2_Stream3);
DMA_InitStruct.DMA_Channel=DMA_Channel_3;
DMA_InitStruct.DMA_DIR=DMA_DIR_MemoryToPeripheral;
DMA_InitStruct.DMA_Memory0BaseAddr=(u32)LensAbck;
DMA_InitStruct.DMA_PeripheralBaseAddr=(u32)&SPI1->DR;
DMA_InitStruct.DMA_MemoryDataSize=42;
DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_FIFOMode=DMA_FIFOMode_Disable;
DMA_InitStruct.DMA_Priority=DMA_Priority_High;
DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;
DMA_Init(DMA2_Stream3,&DMA_InitStruct);
SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE);
DMA_Cmd(DMA2_Stream3,DISABLE);
}
void SPI1_Tx_Buff(void)
{
cnt++;
if(cnt>=3000)
{
cnt=0;
// GPIO_ToggleBits(GPIOB,GPIO_Pin_6);
DMA_Cmd(DMA2_Stream3,DISABLE);
DMA_SetCurrDataCounter(DMA2_Stream3,42);
SPI1->DR;
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
DMA_ClearFlag(DMA2_Stream3,DMA_FLAG_TCIF3);
DMA_Cmd(DMA2_Stream3,ENABLE);
}
}
void SPI2_Tx_Buff(void)
{
flag++;
if(flag>=3000)
{
flag=0;
GPIO_ToggleBits(GPIOB,GPIO_Pin_6);
DMA_Cmd(DMA1_Stream4,DISABLE);
DMA_SetCurrDataCounter(DMA1_Stream4,8);
SPI2->DR;
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_TCIF4);
DMA_Cmd(DMA1_Stream4,ENABLE);
}
}
void SPI2_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
DMA_InitTypeDef DMA_Tx_InitStruct;
//DMA_InitTypeDef DMA_Rx_initStruct;
SPI_InitTypeDef SPI_InitStruct;
//时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
//IO口设置
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//NSS设置
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
//IO口复用
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);
//SPI设置
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_Direction=SPI_Direction_1Line_Tx;
SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_LSB;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;
SPI_InitStruct.SPI_CRCPolynomial=7;
SPI_Init(SPI2,&SPI_InitStruct);
SPI_Cmd(SPI2,ENABLE);
//DMA发送设置
//SPI2_Tx--DMA1-Stream4-channel0
DMA_DeInit(DMA1_Stream4);
DMA_Tx_InitStruct.DMA_Channel=DMA_Channel_0;
DMA_Tx_InitStruct.DMA_DIR=DMA_DIR_MemoryToPeripheral;
DMA_Tx_InitStruct.DMA_Memory0BaseAddr=(u32)CmdTx;
DMA_Tx_InitStruct.DMA_PeripheralBaseAddr=(u32)&SPI2->DR;
DMA_Tx_InitStruct.DMA_BufferSize=8;
DMA_Tx_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_Tx_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_Tx_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_Tx_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_Tx_InitStruct.DMA_FIFOMode=DMA_FIFOMode_Disable;
DMA_Tx_InitStruct.DMA_Priority=DMA_Priority_High;
DMA_Tx_InitStruct.DMA_Mode=DMA_Mode_Normal;
DMA_Init(DMA1_Stream4,&DMA_Tx_InitStruct);
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
DMA_Cmd(DMA1_Stream4,DISABLE);
//SPI2_Rx--DMA1-Stream3-channel0
}
SPI1,SPI2发出的数据图,只有SPI1能发出数据,SPI2却没反应。

|
|