主机:
int main(void)
{
RCC_Configuration(); /* 设置系统时钟 */
GPIO_Configuration(); /* 设置 GPIO 端口 */
SPI_Configuration(); /* 设置 SPI */
USART_Configuration(); /* 设置 USART */
while(Tx_Idx < BufferSize)
{
SPI1_Buffer_Rx[Rx_Idx++] = SPI_WriteByte(SPI1,SPI1_Buffer_Tx[Tx_Idx++]);
}
/* 打印试验结果信息 ---------------------------------------------------------------------------------------------*/
printf("\r\nThe SPI1 has sended data below: \r\n");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d \r" , *(SPI1_Buffer_Tx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("\r\nThe SPI1 has receive data below: \r\n");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d \r" , *(SPI1_Buffer_Rx + k));
for(i = 0 ; i < 200 ; i ++);
}
}
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_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI1, &SPI_InitStructure);
/* 使能 SPI1 */
SPI_Cmd(SPI1, ENABLE);
}
从机:
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
SPI_Configuration();
USART_Configuration();
printf("\r\n START: \r\n");
while(1)
{
while(Rx_Idx < BufferSize)
{
SPI2_Buffer_Rx[Rx_Idx++] =SPI_WriteByte(SPI2,SPI2_Buffer_Tx[Tx_Idx++]);
}
/* 打印试验结果信息 ---------------------------------------------------------------------------------------------*/
printf("\r\nThe SPI2 has receive data below: \r\n");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d \r" , *(SPI2_Buffer_Rx + k));
for(i = 0 ; i < 200 ; i ++);
}
printf("\r\nThe SPI2 has sended data below: \r\n");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d \r" , *(SPI2_Buffer_Tx + k));
for(i = 0 ; i < 200 ; i ++);
}
}
}
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;
/* 设置 SPI2 为从机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE); /* 使能 SPI2 */
}
STM32_1用SPI1设为主机,STM32_2用SPI2设为从机模式,用串口查看接收数据
这是SPI发送接收函数:
u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)
{
while((SPIx->SR&SPI_I2S_FLAG_TXE)==RESET); //等待发送区空
SPIx->DR=Byte; //发送一个byte
while((SPIx->SR&SPI_I2S_FLAG_RXNE)==RESET);//等待接收完一个byte
return SPIx->DR; //返回收到的数据
}
问题:
为什么我的从机收到的总是错误数字 ?麻烦大家了,很急,真心希望指点,我整了好久....
相关解决方案
- STM32 串口通信以致hard fault 产生
- stm32 入门困难吗?解决方法
- stm32 PWM有关问题
- STM32 spi采集ADC128S022误差很大,下面是小弟我的记录值和误差,如何减小误差
- can协议 发送自动重传模式 深入的有关问题 STM32
- STM32 USB 驱动,该怎么解决
- stm32 串口,该怎么处理
- STM32 通用IO模拟串口
- STM32 TIM4 输出比较模式 有关问题
- STM32 IAP程序编写解决方法
- stm32 spi 为何CS总是会自动拉高呢
- stm32-ADC学习,该怎么解决
- stm32 中地址的懂得
- stm32-野火DAC实验之DAC触发源~解决思路
- stm32 数据与地址的懂得
- stm32 基础知识求解解决思路
- stm32 .c .h文件治理
- stm32 编译预加工求解
- stm32 刚入手 有关问题求解
- stm32 C语言 define viod 0的了解
- stm32 IO口输出高电平失败啊
- STM32 GPIO输出高下电平转换速率测试
- freeRtos stm32 的ADC中断有关问题
- stm32 怎么入门
- stm32 spi时序看不懂解决方法
- stm32 flash擦写解决方法
- STM32 ucGUI 有关问题
- STM32 串口通信罗致hard fault 产生
- STM32 在串口终端增加数据处理后,没法正确接受数据
- STM32 中 USART2 接受乱码的有关问题,求大神帮助!