前言
AD7793是一款专门用来测温的芯片,功能强大。使用时MCU需要通过SPI通信总线配置AD7793使其工作,同时也需要SPI总线读取AD数据寄存器的数据。本文简单介绍SPI的通信时序、程序功能,如何简单的通过芯片手册成功配置AD7793芯片。
AD7793介绍
AD7793 是适合高精度测量应用的低功耗、低噪声的模拟/数字转换芯片,内置一个低噪声24 位Σ-Δ 型模拟数字转换器,其中含有3 个差分模拟输入,还集成了片内低噪声仪表放大器,因而可直接输入小信号。当增益设置为64、更新速率为4.17 Hz 时,均方根(RMS) 噪声为40 nV。采用2.7 ~ 5.25 V 电源供电,典型功耗为400 μA。
芯片内置一个精密低噪声、低漂移内部带隙基准电压源,也可采用外部差分基准电压。其它片内特性包括可编程激励电流源、熔断电流控制和偏置电压产生器。利用偏置电压产生器可将某一通道的共模电压设置为AVDD/2。
AD7793 可以采用内部或外部时钟工作,输出数据速率可通过软件编程设置,可在4.17 ~ 470 Hz 的范围内变化。内部结构框图如下
SPI总线
介绍
SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。
SPI分为主、从两种模式,一个SPI通讯系统需要包含一个(且只能是一个)主设备,一个或多个从设备。SPI接口的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。
特点
传输速度较快但是没有指定的流控制,没有应答机制确认是否接收到数据;通常在使用SPI总线的时候STM32需要使用4根线和外设相连。以STM32上的SPI2为例:
NSS:片选设备线,每个从机都有自己的一条单独的总线与主机连接,此总线的作用就是为主机选择对应的从机进行传输数据,每个从机与主机之间的NSS总线互不相干。SPI中规定通信以NSS信号线拉低为开始,拉高为结束。
SCK:时钟信号线,因为SPI是同步通信,所以需要一根时钟信号线来统一主机和从机之间的数据传输,只有在有效的时钟信号下才能正常传输数据,不同设备支持的最高传输频率可能不一样,在传输过程中传输频率受限于低速的一方;SPI是串行通讯协议,数据一位一位进行传输,SCLK提供时钟脉冲,MISO、MOSI则基于此脉冲完成数据传输。
MOSI:(Master Output, Slave Input),顾名思义,MOSI就是主机输出/从机输入,因为SPI是全双工的通信总线,即主机和从机可以同时收发数据,这样的话就需要俩条线同时分别负责:主->从和从->主这俩条传输线路。而MOSI就专门负责主机向从机传输数据。
MISO:(Master Input,, Slave Output),与MOSI恰恰相反,MISO专门负责从机向主机传输数据。
通信时序
以SPI通信时序图为例,通讯过程中所有的运作都是基于SCK时钟线进行,SPI通讯的起始和停止都是由NSS信号线控制,当NSS为低电平时表示起始信号,高电平则表示停止信号;SPI中使用MOSI和MISO来进行全双工传输数据,SCK来同步数据传输,即MOSI和MISO同时工作,在时钟信号线SCK为有效时对MOSI、MISO数据线进行采样,采到的信息即为传输的信息。
主设备和从设备之间需要处于同一种工作模式下,我们通常来说是通过配置主设备来满足从设备的模式要求,主要有四种工作模式;
主要通过时钟极性CPOL和时钟相位CPHA配置工作模式,详细信息请百度。
STM32中SPI总线配置
void SPI1_Init(void)
{
/*分别定义两个结构体--------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTB时钟使能
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );//SPI1时钟使能
/*配置SCK、MISO、MOSI引脚--------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB5/6/7复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
/*配置CS片选引脚为普通的IO--------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;