历史上的今天
今天是:2025年02月27日(星期四)
2018年02月27日 | 基于PIC16F73单片机和ADS8341的SPI通信软硬件实现方法
2018-02-27 来源:eefocus
PIC单片机为美国微芯公司(Ml-CROChip)公司生产研发,品种极其丰富,各系列片内功能资源各不相同,可以满足用户不同层次的开发要求。它采用哈佛总线结构和精简指令集(RISC)技术,其寻址方式简单、运行速度快、功耗低、驱动能力强等。在MICROCHIP公司PIC系列产品里,有低档、中挡、高挡单片机,且大部分都带有USART、SPI、IIC等总线接口,有的甚至还带有USB和CAN模块。这些特点给开发者带来了很大的方便。
1.ADS8341的特性 ADS8341是一种比较新的逐次逼近式的16位的A/D转换器件,其需要2.7~5V单电压供电,具有4通道单独输入或2通道差动输入,可以通过一个8位的控制字来选择其输入通道,且转换速率大于100kHz,精度比较高,具有86dB的信噪比,带有串行外围接口(SPI)。其这些特点给数据采集带来了极大的方便。其控制字节如下表所示。

根据上表中的介绍,本文中设置ADS8341的控制命令字为94H,即S置1,控制信号开始,A2A1A0置001,选择通道CHO,SGL/DIF置1,选择单通道输入,PDIPDO置00,选择低功耗模式和工作方式为外部时钟模式。
在本文中外部时钟模式工作,即ND的移位时钟由PIC16F73提供,外部时钟控制A/D转换过程和输入时钟。当ADS8341接收完控制字节的最后一位紧接着的一个时钟周期过后BUSY脚就会被ADS8341拉高,随后转换结果会建立并在后16个时钟周期的下降沿出现在DOUT上,如下图时序图所示在外部时钟模式下的忙状态BUSY保持高电平直到MSB被建立,要消耗一个时钟周期,16位的转换数据完全输出需要16个时钟周期,这样一次数据采样最少需要25个时钟周期。因为PIC16F73单片机连接都用8Bit传送数据,这意味着必须增加一个额外的传送来捕获LSB,这里采用了32个时钟周期来处理这样的要求,每次转换用32个时钟周期,前8个时钟周期用于发送控制字,后24时钟周期将采样结果从ADS8341输出。最后8个时钟周期的第一个时钟周期用来捕获LSB位,剩下的最后7个时钟周期空闲。

2.硬件方法实现SPI通信 SPI是由美国摩托罗拉公司推出的一种同步串行传输规范,常作为单片机外设芯片串行扩展接口。SPI有4条引脚:SS(从器件选择线),SDO(串行数据输出线),SDI(串行数据输入线),SCK(同步串行时钟线)。SPI可以用全双工通信方式同时发送和接受8位数据。在发送数据时,只需将要发送的数据送入发送数据缓冲区SSPBUF中,系统硬件会自动将发送数据缓冲区里的数据装载到移位寄存器SSPSR中,然后根据预先选中的时钟节拍进行移位将数据串行发送,主机在发送8个Bit的数据的同时也接收了8个Bit的数据。

如上图所示,为硬件实现SPI通信时的PIC16F73与ADS8341的连接电路图,当在启动ADS8341进行数据采集时首先按照要求将8个Bit的控制字串行发送给ADS8341,然后ADS8341开始按照控制字的要求工作,等控制字发送完毕后,向ADS8341发送3个8Bit无效数据,以提供给ADS8341移位时钟DCLK,当这24个Bit的数据发送完毕时,也就接收到了所采集到的16Bit的数据。这样一次数据采样需要了32个时钟周期。
PIC16f73控制ADS8341工作的子程序如下:

3.软件方法实现SPI通信

如上图所示,在此方法中使用RBO模拟SPI方式下的移位时钟DCLK,RB1模拟专用输入引脚SDI,RB2模拟专用输出引脚DOUT。RB3用以判断一个字节的数据是否转换完成。模拟DCLK时钟时,高电平和低电平的输出时间必须大于或等于Tch和Tcl.的最小值,根据ADS8341的数据采集时序图1可以对单片机写控制程序。
空闲时让RBO口置低电平以使DCLK停留在低电平上。当要发送控制字时,首先判断其第一位是1还是0,若是0则先把RB2口置低,然后RBO口置3个指令周期时间(3T>Tch=Tcl.)的高电平后再置3个指令周期时间低电平,就将一位O送出。若是1,则将RB2口置高,然后RBO口置3个指令周期时间(3T>Tch=Tcl.)的高电平后再置3个指令周期时间低电平,就将一位1送出。同理,连续将控制字的8个Bit发送完毕。当控制字发送完毕后,用RBO模拟16个移位时钟周期,最后用RBO模拟空走8个移位时钟周期以从ADS8341中输出LSB位,这样一次数据采样需要了32个时钟周期。PIC16F73在每个移位时钟DCLK的下降沿时读出PORTB的Bitl位,然后送给状态寄存器STATUS的状态标志位C,再使用循环左移指令RLF将状态标志位C里的数值移进RESUALTG和RESUALTL寄存器里,
PIC16f73控制ADS8341工作的子程序如下:


史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 我们要使用的芯片是:ET13X211作为接收 ET13X221作为发送,电路如图所示 接收电路为: 主程序流产图如下: 详细信息在附件。 [ 本帖最后由 njlianjian 于 2009-9-3 09:15 编辑 ] &nbs ...… 查看全部问答> |
|
一、 综合词汇 1、 印制电路:printed circuit 2、 印制线路:printed wiring 3、 印制板:printed board 4、 印制板电路:printed circuit board (PCB) 5、 印制线路板:printed wiring board(PWB) 6、 印制元件:printed component 7、 印 ...… 查看全部问答> |
|
哪位大侠给解决下vicor模块电源不输出的问题。 情况是这样的,用的vicor模块是V24C5T50BG,sc端与+out端接的是147.157的Trim up电阻。输入电压正常为:23.99v(+IN -- -IN),PC对-IN端电压6.01v,输出电压不正常0.88v(+out -- -out). 麻烦那位大 ...… 查看全部问答> |
|
mp3的播放器采用标准的wince api函数来编写的,在wince环境下,能够正常播放、暂停和停止播放,但是在暂停后无法继续播放。具体原因是在暂停后,无法获取暂停时MP3播放的位置。在IMediaSeeking类中,GetCurrentPosition函数获取的播放 ...… 查看全部问答> |
|
S3C2410怎么利用超级终端把ADS1.2生成的BIN文件烧进FLASH中? 小弟我现在正在学习S3C2410开发板,现在遇到难题!! 我想把ADS1.2生成的BIN文件烧到FLASH运行,可是我不知道怎么操作! 我用UART0连接开发板,并且是烧进线性FLASH中的,既把开发板上的S1挑到右边, 但是出现的屏幕上的信息是是否进入Linux?当我选择NO ...… 查看全部问答> |
|
各位大侠好! 今天看2440的ds,突然注意到一个问题,就是如果从nand启动话,手册上说先把flash里的前4K复制到steppingstone里,再执行里面的程序,但是有个问题,nand flash的操作很复杂,读写都需要一些命令,时序,在arm还没有 ...… 查看全部问答> |
|
用如下代码软件仿真,A0口不输出10K的PWM波,大哥看看哪里不对?试了很多了,PWM不工作。void main (void){// Set internal RC clock RCCR = RCCRH0;   ...… 查看全部问答> |
|
TI的参考设计中2591的三个电源端都有TLIN inductor,这个TLIN inductor可以不要的吗?还有就是这个TLIN不知道什么意思。… 查看全部问答> |




