STM8的SPI还是挺好用的,也挺简单,起码相比于I2C来说是的。最近因为要调试NRF905,所以就用到了STM8的SPI。因为调试过程中没有遇到什么大的问题,所以在此只对STM8的SPI作简单的介绍。博主只使用了STM8作为主设备的双线单向数据模式,并且没有使用CRC。
在使用STM8的SPI时首先需要确认——
1.主从关系,并且确认是否使用STM8上的NSS引脚作为主从判据
2.SPI时序,四种有差异的时序
3.串行数据是MSB在前还是LSB在前
以上条件很好地弄清楚后,便可以配置寄存器了。因为主模式下数据收发全由STM8自身控制,所以不需要使用中断。另外端口也无需设置,使用默认状态就可以。需要配置的寄存器只有SPI_CR1和SPI_CR2。
几个要点:
1.在配置这两个寄存器时确保SPI_CR1中的SPE复位,禁止SPI。在配置完成后方可将其打开,使能SPI。
2.SPI_CR2中的SSM和SSI配合使用,若SSM置位使能了软件从设备管理,则原NSS引脚将与SPI没有一丁点的关系,SSI完全代替了NSS引脚。
3.若与STM8通信的器件对通信的频率(波特率)没有要求,SPI_CR1中的BR可随意,可设为000最高速。
4.CPOL和CPHA的选择,查看与STM8通信的器件手册,一般会给出SPI时序图,对比STM8手册上的时序图便可确定。
其余按要求配置便可。
主模式下的读写操作同样很简单。
写:
1.复位选中器件的CS,使其进入从模式,准备接受数据
2.先查询SPI_SR中的TXE标志(循环查询),直到置位,只有当发送缓冲区空时方可发送数据
3.将数据写入SPI_DR,数据将自动发送出去
4.循环等待查询SPI_SR中的RXNE标志,等待数据发送完毕并接收回传数据,直到置位
5.读出SPI_DR中的数据,复位RXNE
6.置位选中器件的CS,结束数据传输
若要连续进行数据传输,只需复位一次CS,重复步骤2-5,直到所有数据传输完毕,再置位CS。
从上可以看出,在SPI写的过程中,同时也将从机的数据读回来。STM8的SPI读实际上就是写,因为SPI通信的CLK信号由主设备提供,而STM8的SPI里面,CLK信号的产生途径只有一个,就是作为主设备时写数据。所以要想读取从机的数据,为了产生CLK信号,STM8必须给从机写。那么写什么呢?在读取数据时,应该给从机写一个没有意义的字节,写这个字节只是单纯地为了产生CLK信号,从机并不会对其有任何响应。这个字节就称为DUMMY_BYTE。
于是,读操作只是执行一次写DUMMY_BYTE的操作,读回返回值即可。连续读取则连续发送DUMMY_BYTE。
以上。祝大家学习愉快。
关键字:STM8 SPI通信 NRF905
引用地址:
浅谈STM8(3)——SPI通信
推荐阅读最新更新时间:2024-11-12 04:18
STM8中 TIME4寄存器的应用
STM8系统复位后,所有外设时钟均处于开的状态。用户可以通过清除CLK_PCKENR1或 CLK_PCKENR2中的PCKEN位来关闭相应的外设是时钟。 时钟分频寄存器 (CLK_CKDIVR) 如果一个引脚只具有电平的输出能力,称该引脚为输出引脚或驱动引脚; 如果一个引脚具有电平的输入能力,则称该引脚为输入引脚。 同时具备输入和输出能力的引脚称为通用引脚。 引脚输出高电平时形成的电流称为拉电流; 引脚输出低电平时形成的电流称为灌电流; 基本型定时器(TIM4/TIM6) TIME4可以作为时基发生器 @inline static void tick_init(void) { TIM4- PSCR = TIM4_PRE
[单片机]
STM8 主时钟状态寄存器
STM8主时钟状态寄存器(CLK_CMSR) STM8S提供三种类型的TIM定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器来设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。 STM8S系列的定时器TIM1,TIM5和TIM6之间没有共享任何资源,但是它们可以按TIM5/TIM6定时器的同步中的描述来同步和连接。在拥有TIM1,TIM2,TIM3和TIM4定时器的STM8S系列产品中,定时器是没有连接在一起的。 本章仅给出不同定时器功能之间的比较和内部定时器信号名的词汇表。 下一章16位
[单片机]
STM8学习笔记——初步认识
最近项目要求找个便宜又够用的单片机,本来是想选STC的,但其实STC也并不便宜,且调试比较麻烦,而且AD不是很好,所以选择了STM8。昨天买来了ST-LINK III,拿了一块STM8S105S4,此单片机有16K ROM,2K RAM,1K的EEPROM,带10bitADC,定时器(ICOCPWM)和SPI I2C UART通讯接口,看门狗等,封装为LQFP44。 这款单片机的供电分得很细,主电源、IO口、模拟供电都分开,这样就可以非常灵活的配置,比如模拟供电可以选用5V以扩大量程;IO口可以配置位3.3或5V以适应一些设备。上图中VDD/VSS引脚用于给内部主电压调节器(MVR)和内部低功耗电压(LPVR)调节器供电
[单片机]
STM8单片机常见问题及解决方案
仿真报错 error30220 在用STVD软件仿真程序的时候,有时候报错。弹出一个error30220的警告窗口。 引起这个问题原因有可能是烧写软件STVP软件刚烧写过程序,STLINK 被烧写软件占用了,这时可以把烧写软件STVP关掉,然后重新仿真,就能正常使用了。如果还不行就拔掉STLINK烧写器,关掉软件。重新打开软件,连接烧写器。 烧写程序时报错 有时候在烧写程序的时候会提示RAM中已经存了一个文件 这是因为片子里面已经烧写过程序,而这次烧写程序的时候,有可能点到了第三个按钮上(方块圈起来的),烧写时用第二个文件夹图标的按钮。另外在烧写的时候要注意芯片型号是否选择正确。 烧不进去程序 有时
[单片机]
STM8在IAR中Printf的整形长度问题
//ld是32位的 printf( up_intval:%ldrn ,device_set.upload_tem); //d是16位的 printf( up_intval:%drn ,device_set.upload_tem);+ 如果device_set.upload_tem是32位,那么用第二个打印就会出问题,数值异常之类的
[单片机]
STM32单片机SPI主从通信解析
今天讲解“STM32F103 SPI主从通信”,原本计划将这部分内容定在后面(第二阶段)来讲解,满足一位网友的问题“关于两块MCU的SPI通讯”,所以今天特地提前讲解了。 今天提供并讲解的软件工程,基于昨天的软件工程“SPI读写Flash”修改而来。 测试原理及现象:主机间隔500ms发送10个字符(0-9),从机开启SPI中断接收数据,接收满10字节数据,置标志位gSPI_FlagOver有效,并变化LED,通过串口打印接收到的数据。 关于“STM32F103SPI通信从机部分”我把重要的几点在下面分别讲述,若不明白,请关注微信公众号“EmbeddDeveloper”查阅或留言。 一、RCC时钟配置 该函数位于在bs
[单片机]
stm8 io口重映射
STM8S003F3端口可以设置重映射,如pin16的PC6管脚,默认复用功能是SPI_MOSI功能,可以重映射为TIM1_CH1,也就是timer1的1通道。映射方式并不像STM32那样有个AFR寄存器来配置,而是配置Option bytes字节,如下图 也就是OPT2寄存器,注意是STM8S003F3系列的,其它的芯片配置字节是不一样的。 比如要配置PC6引脚为定时器1PWM输出比较通道TIM_CH1, 配置方法如下: OPT2是个8位的寄存器,配置的方式比较特别,类似FLASH操作,有两种方法配置,一种是通过STVP进行配置,也就是通过ST的烧录软件界面那里配置(或者IAR软件里选项字节配置); 另一
[单片机]
STM8学习总结三:TIM1定时器使用
本文主要总结关于STM8在库函数开发时,各条语句的含义。 (1)TIM1初始化配置函数 函数主要作用:对计数器的参数,工作模式进行设定,并使能; void Tim1_Init(void) { TIM1_TimeBaseInit(16,TIM1_COUNTERMODE_UP,1000,0); //(定时器频率:16分频即系统频率的1/16,为1M,向上计数,定时器溢出值,重装载计数从0开始) TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);//中断配置与使能函数 TIM1_ARRPreloadConfig(ENABLE);//使能数值自动重装载功能 TIM1_Cmd(E
[单片机]