基于PIC18f45k22单片机与ADS8341的SPI通信

点赞:26191 浏览:119121 近期更新时间:2024-03-09 作者:网友分享原创网站原创

摘 要:本文介绍了通过硬件和软件两种方式实现PIC18f45k22单片机与TI公司的模数转换器ADS8341的SPI接口通信,给出了具体的硬件电路和相关的软件流程,实现了数据交换.

关 键 词 : PIC18f45k22;SPI;ADS8341;共用体

中图分类号:TP368.12 文献标识码:A 文章编号:1674-7712 (2013) 12-0000-01

一、ADS8341简介

ADS8341是TI公司在2001年推出的具有串行接口的16位高速逐次逼近行的A/D转换器.它是拥有4通道独立输入端或2通道差动输入端,带有SPI接口的通信,转换速率大于100KHZ,转换精度高,芯片工作电压范围在2.7V~5V,SSOP-16封装,安装尺寸很小,正常温度为-400C~+850C.基准电压源的范围为500mV-Vcc之间变化,在低功耗模式下,芯片的功率小于15μW.

二、ADS8341与PIC18f45k22通信的硬件设计

在这里我们使用的是微星公司的PIC18f45k22单片机与ADS8341进行SPI通信,连接图如下:

ADS8341控制字的设定,参考表-1,s必须拉高,才能开始转换.A0-A2为转换的输入端口,具体设置参考表-2.SGL/DIF为单端模拟信号或是差动信号输入控制位,它必须结合A0―A2一起设置模拟信号的输入.PD0与PD1为电源模式的选取位.例如我们设置控制字为94H,开始AD转换的是CH0单通道,进入低功耗模式和工作方式为外部时钟模式.


在外部时钟模式下,ADS8341的时钟由MCU提供,当它接收到来自MCU的控制字随后的一个时钟周期BUSY脚被拉高,转换的结果会在后16个周期的下降沿通过DOUT脚输出,具体的数据时序图请参考它的datasheet.在外部时钟模式下,BUSY维持高电平到输出数据MSB的建立需要一个时钟周期,完成一次AD数据的采集至少需要25个时钟周期,若采用的是8位的MCU与ADS8341进行通信,需要对ADS8341的输出数据进行读三次.基于以上考虑,我们可以采用32个时钟周期来读一次转换的数据,前8个时钟周期用于MCU发送控制字,后面24个时钟周期,连续三次读DOUT引脚的数据.在具体C语言编程上面,我们可以借助一个联合体,和一个属部变量来达到最终目的,部分程序如下.相应的MCU寄存器的配置就不详述,该款单片机我们可以直接使用它的库函数对SPI接口进行读写,使用非常方便.

union u AD

{

unsigned int A;

unsigned char B[2];

}//定义的联合体

SPI_CS 等于 0; //片选拉低,启动AD芯片

SPI_Write(0); //选择 CH0 为AD的输出

uAD.B[1] 等于 ReadSPI1(); //第1次读DOUT数据

uAD.B[0] 等于 ReadSPI1(); //第2次读DOUT数据

ucAdlow0 等于 ReadSPI1(); //第3次读DOUT数据 . ucAdlow0为定义的临时变量,

uAD.A 等于 (uAD.A<<1) + (ucAdlow0>>7); //数据合并

三、软件程序实现

在MPLAB集成开发环境下,运用微星公司18系列单片机的函数库对PIC18f45k22进行相关操作设置非常方便.在这里以SPI口读取ADS8341转换结果,并把结果通过串口发送出来,方便用串口助手等工具进行观察,具体以主函数为例来说明整个流程.

void main(void)

{

union ad_r //定义一个共用体

{

unsigned char ad[2];

unsigned int y;

基于PIC18f45k22单片机与ADS8341的SPI通信参考属性评定
有关论文范文主题研究: 关于时钟的文章 大学生适用: 高校毕业论文、学年论文
相关参考文献下载数量: 71 写作解决问题: 学术论文怎么写
毕业论文开题报告: 论文任务书、论文题目 职称论文适用: 职称评定、职称评初级
所属大学生专业类别: 学术论文怎么写 论文题目推荐度: 优质选题

}adr;

InitialMCU(); //单片机初始化,包含IO口设置、中断设置串口1初始化等.

while(1)

{

SPI_CS 等于 0; //SPI片选信号

Delay1KTCYx(50); //延时

putcSPI1(0x94); //单片机的SPI口发送ADS8341的控制字

while(SPI_BUSY); //判断AD转换是否完成

adr.ad[1] 等于 getcSPI1(); //读出AD转换结果的高8位

adr.ad[0] 等于 getcSPI1(); //读出AD转换结果的低8位

Delay1KTCYx(50); //延时

SendBytebyUART1('#'); //串口1发送标识符“#”

SendBytebyUART1( adr.ad[1]); //串口1发送AD转换结果的高8位

SendBytebyUART1( adr.ad[0]); //串口1发送AD转换结果的低8位 SendBytebyUART1('\r'); //回车

SendBytebyUART1('\n'); //换行

};

}

四、结束语

本文在硬件上运用PIC18f45k22单片机与ADS8341进行连接,在软件方面,在MPLAB集成开发环境下运用C语言编程,特别是定义一个共用体,成功实现对ADS8341的AD转换结果的读取,实现了数据交换.