硬件SPI+NRF24L01

本文介绍了如何在STM8微控制器上配置硬件SPI以实现与NRF24L01无线收发模块的通信。重点讨论了SPI的CR1和CR2寄存器配置,包括波特率、时钟极性和初始相位的设置。并提供了相关的SPI及NRF24L01的代码实现。
摘要由CSDN通过智能技术生成

STM8硬件SPI配置比较简单。主要CR1 CR2的配置 

其中核心的地方是波特率 时钟极性 和初始相位

下面是SPI的代码配置

#include "spi.h"
void SPI_Init( )
{
	CLK_PCKENR1 |= 0x02;  //打开SPI时钟
	/*PC6、PC5设置为输出,最大10MHz*/
	PC_DDR_DDR5 = 1;//输入方向选择  0: 输入模式 1: 输出模式
	PC_CR1_C15 = 1;//输出模式控制  推挽输出
	PC_CR2_C25 =1;//在输出模式下,0:输出速度最大为2MHZ.1:输出速度最大为10MHZ
	PC_DDR_DDR6 = 1;//输入方向选择  0: 输入模式 1: 输出模式
	PC_CR1_C16 = 1;//输出模式控制  推挽输出
	PC_CR2_C26 =1;//在输出模式下,0:输出速度最大为2MHZ.1:输出速度最大为10MHZ
	PC_DDR_DDR7 = 0;//输入方向选择  0: 输入模式 1: 输出模式
	PC_CR1_C17 = 1;//输出模式控制  推挽输出  输入模式  0:浮空输入 1 带上拉电阻输入
	PC_CR2_C27 =0;//在输出模式下,0:输出速度最大为2MHZ.1:输出速度最大为10MHZ
	SPI_CR1=0;

	/*MSB、1MHz、主设备、CPOL空闲为高、CPHA第一个时钟开始*/
	SPI_CR1_LSBFIRST=0;//0:先发送MSB;
	SPI_CR1_MSTR=1; //主设备
	SPI_CR1_CPOL=0; //CPOL空闲为高
	SPI_CR1_CPHA =0; //数据从第一个时钟边沿开始采样
	SPI_CR1_BR=0;   //8M Hz
	/*双线单向视距传输、CRC计算禁止、软件NSS、主模式*/
	SPI_CR2_SSM=1 ;  //1:使能软件从设备管理
	SPI_CR2_SSI=1;  //0:从模式; 1:主模式。 NSS引脚上电平决定于该位的值,而不是NSS引脚上I/O端口的值。
	SPI_CR2_RXONLY=0;	//0:全双工(同时发送和接收);1:输出禁止(只接收)。
	SPI_CR2_CRCNEXT=0;	//0:下一个发送的数据来自Tx缓冲区 1:下一个发送的数据来自Tx CRC计数器
	SPI_CR2_CECEN=0;	//0:CRC计算禁止; 1:CRC计算使能。
	SPI_CR2_BDOE  =0;	//0:输入使能(只接收模式); 1:输出使能(只发送模式)。
	SPI_CR2_BDM  =0;	//0:选择双线单向数据模式; 1:选择单线双向数据模式
	SPI_ICR_RXIE=0;         //发送完成中断 禁止
	/*开启SPI*/
	SPI_CR1_SPE=1;
}



uint8_t  Write_char_SPI(uint8_t date )
{
	uint8_t retry=0;
	while(SPI_SR_TXE==0)
		{
			retry++;
			if(retry>=0XFE)return 0; 	//超时退出
		}
	retry=0;
	SPI_DR=date;
	while(SPI_SR_RXNE==0)
		{
			retry++;
			if(retry>=0XFE)return 0;	//超时退出
		}
	return SPI_DR;
}
//返回值1 为发送失败  0为成功
uint8_t  Write_SPI(const uint8_t *date ,uint8_t size)
{
  uint8_t retry=0;
  for(;size>0;size--)
  {
    while(SPI_SR_TXE==0)
      {
        retry++;
	if(retry>=0XFE)return  1; 	//超时退出
        }
    retry=0;
        SPI_DR=*date;
    date++;
/*   while(SPI_SR_RXNE==0)
     {
	retry++;
    if(retry>=0XFE)break ;	//超时退出
  }
	test= SPI_DR;
*/
  }
  if(retry>=0XFE)
  return        1;
  else return 0;        //发送成功

}

void SPI_SetSpeed(uint8_t SpeedSet)
{
	SpeedSet&=0X07;			//限制范围
	SPI_CR1_SPE=0; 	                //SPI设备失能
	SPI_CR1_BR=SpeedSet;
	SPI_CR1_SPE=1; 		     
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值