/* 自定义同义关键字 ——————————————————–*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
/* 自定义参数宏 ——————————————————–*/
define BufferSize 32
/* 自定义函数宏 ——————————————————–*/
/* 自定义全局变量 ——————————————————–*/
SPI_InitTypeDef SPI_InitStructure; /* 定义 SPI 初始化结构体 */
u8 SPI1_Buffer_Tx[BufferSize] = /* 定义待 SPI1 传输数据 */
{
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20
};
u8 SPI2_Buffer_Tx[BufferSize] = /* 定义待 SPI2 传输数据 */
{
0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,
0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,
0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,
0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70
};
u8 SPI1_Buffer_Rx[BufferSize]; /* 开辟内存空间待 SPI1 接收 */
u8 SPI2_Buffer_Rx[BufferSize]; /* 开辟内存空间待 SPI2 接收 */
u8 Tx_Idx = 0; /* 发送计数变量 */
u8 Rx_Idx = 0; /* 接收计数变量 */
vu8 k = 0 , i = 0; /* 循环计数变量 */
/* 自定义函数声明 ——————————————————–*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void SPI_Configuration(void);
void USART_Configuration(void);
/*********************************************************************
* 函数名 : main
* 函数描述 : main 函数
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*********************************************************************/
int main(void)
{
/* 设置系统时钟 */
RCC_Configuration();
/* 设置 GPIO 端口 */
GPIO_Configuration();
/* 设置 SPI */
SPI_Configuration();
/* 设置 USART */
USART_Configuration();
/* 设置 SPI2 为主机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI1, &SPI_InitStructure);
/* 设置 SPI2 为从机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_Init(SPI2, &SPI_InitStructure);
while(Tx_Idx < BufferSize)
{
/* 等待 SPI1 发送缓冲空 */
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* SPI2 发送数据 */
SPI_I2S_SendData(SPI2, SPI2_Buffer_Tx[Tx_Idx]);
/* SPI1 发送数据 */
SPI_I2S_SendData(SPI1, SPI1_Buffer_Tx[Tx_Idx++]);
/* 等待 SPI2 接收数据完毕 */
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
/* 读出 SPI2 接收的数据 */
SPI2_Buffer_Rx[Rx_Idx] = SPI_I2S_ReceiveData(SPI2);
/* 等待 SPI1 接收数据完毕 */
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* 读出 SPI1 接收的数据 */
SPI1_Buffer_Rx[Rx_Idx++] = SPI_I2S_ReceiveData(SPI1);
}
/* 打印试验结果信息 ---------------------------------------------------------------------------------------------*/
printf("rnThe First transfer between the two SPI perpherals: The SPI1 Master and the SPI2 slaver. rn");
printf("rnThe SPI1 has sended data below: rn");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d r" , *(SPI1_Buffer_Tx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("rnThe SPI2 has receive data below: rn");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d r" , *(SPI2_Buffer_Rx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("rn rn");
printf("rnThe SPI2 has sended data below: rn");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d r" , *(SPI2_Buffer_Tx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("rnThe SPI1 has receive data below: rn");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d r" , *(SPI1_Buffer_Rx + k));
for(i = 0 ; i < 200 ; i ++);
}
/* 打印试验结果信息 ---------------------------------------------------------------------------------------------*/
Tx_Idx=0;
Rx_Idx=0;
for(k=0; k < BufferSize; k++)
{
*(SPI2_Buffer_Rx + k) = 0;
}
for(k=0; k < BufferSize; k++)
{
*(SPI1_Buffer_Rx + k) = 0;
}
/* 设置 SPI2 为主机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI2 , &SPI_InitStructure);
/* 设置 SPI1 为从机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_Init(SPI1 , &SPI_InitStructure);
while(Tx_Idx < BufferSize)
{
/* 等待 SPI2 发送缓冲空 */
while(SPI_I2S_GetFlagStatus(SPI2 , SPI_I2S_FLAG_TXE) == RESET);
/* SPI1 发送数据 */
SPI_I2S_SendData(SPI1 , SPI1_Buffer_Tx[Tx_Idx]);
/* SPI2 发送数据 */
SPI_I2S_SendData(SPI2 , SPI2_Buffer_Tx[Tx_Idx++]);
/* 等待 SPI1 接收数据完毕 */
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* 读出 SPI1 接收的数据 */
SPI1_Buffer_Rx[Rx_Idx] = SPI_I2S_ReceiveData(SPI1);
/* 等待 SPI2 接收数据完毕 */
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
/* 读出 SPI2 接收的数据 */
SPI2_Buffer_Rx[Rx_Idx++] = SPI_I2S_ReceiveData(SPI2);
}
/* 打印试验结果信息 ---------------------------------------------------------------------------------------------*/
printf("rn rnThe Second transfer between the two SPI perpherals: The SPI2 Master and the SPI1 slaver. rn");
printf("rnThe SPI2 has sended data below: rn");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d r" , *(SPI2_Buffer_Tx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("rnThe SPI1 has receive data below: rn");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d r" , *(SPI1_Buffer_Rx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("rn rn");
printf("rnThe SPI1 has sended data below: rn");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d r" , *(SPI1_Buffer_Tx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("rnThe SPI2 has receive data below: rn");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d r" , *(SPI2_Buffer_Rx + k));
for(i = 0 ; i < 200 ; i ++);
}
/* 打印试验结果信息 ---------------------------------------------------------------------------------------------*/
while(1);
}
/*********************************************************************
* 函数名 : RCC_Configuration
* 函数描述 : 设置系统各部分时钟
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*********************************************************************/
void RCC_Configuration(void)
{
/* 定义枚举类型变量 HSEStartUpStatus */
ErrorStatus HSEStartUpStatus;
/* 复位系统时钟设置 */
RCC_DeInit();
/* 开启 HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* 等待 HSE 起振并稳定 */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判断 HSE 起是否振成功,是则进入if()内部 */
if(HSEStartUpStatus == SUCCESS)
{
/* 选择 HCLK(AHB)时钟源为SYSCLK 1分频 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 选择 PCLK2 时钟源为 HCLK(AHB) 1分频 */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 选择 PCLK1 时钟源为 HCLK(AHB) 2分频 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 设置 FLASH 延时周期数为2 */
FLASH_SetLatency(FLASH_Latency_2);
/* 使能 FLASH 预取缓存 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能 PLL */
RCC_PLLCmd(ENABLE);
/* 等待 PLL 输出稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 选择 SYSCLK 时钟源为 PLL */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待 PLL 成为 SYSCLK 时钟源 */
while(RCC_GetSYSCLKSource() != 0x08);
}
/* 打开 SPI2 时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
/* 打开 GPIOA,GPIOB,USART1 和 SPI1 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_USART1 |RCC_APB2Periph_SPI1, ENABLE);
}
/*********************************************************************
* 函数名 : GPIO_Configuration
* 函数描述 : 设置各GPIO端口功能
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*********************************************************************/
void GPIO_Configuration(void)
{
/* 定义 GPIO 初始化结构体 GPIO_InitStructure */
GPIO_InitTypeDef GPIO_InitStructure;
/* 设置 SPI1 引脚: SCK, MISO 和 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);
/* 设置 SPI2 引脚: SCK, MISO 和 MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 设置 USART1 的Tx脚(PA.9)为第二功能推挽输出功能 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/* 设置 USART1 的Rx脚(PA.10)为浮空输入脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , &GPIO_InitStructure);
}
/*********************************************************************
* 函数名 : SPI_Configuration
* 函数描述 : 设置 SPI 参数
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*********************************************************************/
void SPI_Configuration(void)
{
/*
* SPI 设置为双线双向全双工
* SPI 发送接收 8 位帧结构
* 时钟悬空低
* 数据捕获于第二个时钟沿
* 内部 NSS 信号由 SSI 位控制
* 波特率预分频值为 4
* 数据传输从 LSB 位开始
* 用于 CRC 值计算的多项式
*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
/* 使能 SPI1 */
SPI_Cmd(SPI1, ENABLE);
/* 使能 SPI2 */
上一篇:STM32 flash读写程序
下一篇:stm32 I2C自收发测试例程
推荐阅读最新更新时间:2024-11-05 21:27
设计资源 培训 开发板 精华推荐
- 8W、-12V、12V 交流转直流多输出电源
- LTC3443 的典型应用 - 大电流微功率 600kHz 同步降压-升压型 DC/DC 转换器
- 使用 ON Semiconductor 的 ASM8P18S43ER 的参考设计
- 使用 dsPIC33FJ128GP DSC 系列的脉搏血氧仪演示套件
- LT3681 的典型应用 - 具有集成功率肖特基二极管的 36V、2A、2.8MHz 降压型开关稳压器
- ZR431GTA 可调精密齐纳并联稳压器的典型应用
- 使用 Analog Devices 的 LTC2411-1CMS 的参考设计
- LM358DMR2G 双四路滤波器运算放大器的典型应用
- 【训练营】物联网时钟
- 使用 Analog Devices 的 LTC1458LCG 的参考设计
- 西门子EDA直播:多板产品互联规划方案,为破局而来!
- 有奖直播:人机互动介面和机器视觉应用上的最佳助手--瑞萨电子 RZ/G, RZ/A 和 RZ/V SoC系列
- 课随你变 票选你选型觉得最困难的元器件,干货越多礼品越大!
- 9月24日 直播|Microchip mSiC™产品及其在电动出行中的典型应用方案
- 下载安森美半导体工业物联网工业解决方案,百份好礼送!
- 第二季学习体验活动风暴来袭!
- 下载有礼|是德科技电子书 《通过了解测试精度的基础知识, 提高良率并降低风险》,不做“差不多先生”
- 荣耀三月 我是原创我最牛!(恩智浦全程赞助)
- 有奖直播:TI 低功耗 MCU 产品和 Zigbee 无线解决方案
- 罗姆有奖直播 | 高输出功率激光二极管—助力激光雷达性能提升