完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 枫林幽魂 于 2012-11-13 19:59 编辑 PIC16系列单片机SPI接口学习笔记 一、SPI总线是四线结构:
SPI接口有两个重要的寄存器:发送和接收移位寄存器SSPSR、发送和接收缓冲寄存器SSPBUF ,用户只能访问SSPBUF寄存器而无法访问SSPSR寄存器 。模块结构下图: 在SSPSR正处于数据移位过程中时,试图再往SSPBUF写入的数据将会被丢弃。同时WCOL会被置位。但是不会组织后续数据写入,必须软件清零。 我个人将这种通信方式理解为环形移位操作。主从典型连接图如下: 可以将SSPBUF比作生产线上运送包的工具,SSPSR比作打包解包的工具,SDO和SDI组成的环路比作传送带。但是这里的包是指数据字节,而传送带传送的是数据位,完成一个循环周期两个SSBUF数据发生交换。 四、相关时序图 下图是主模式下的时序图,由SKP和SKE配置得到的四种不同的时钟都可以为数据通信提供同步,从图中可以注意到SMP的不同状态决定了数据输入的采样位置。当SMP为1时将在每个周期的末尾采样,当SMP为0时将在每个周期的中间采样,通常情况下设置SMP为1。 void spi_tran(uchar dat) //数据传输函数(传送带操作) { SSPBUF=dat; //写入要发送的数据 while(!SSPIF); SSPIF=0; temp_dat=SSPBUF; //获取读回的数据 } void lc320_write(uchar addrl,uchar addrh,uchar dat)//往23lc320写字节 { cs=0; nop(); spi_tran(0x06); //写允许操作 cs=1;nop();nop(); cs=0;nop(); spi_tran(0x02); //写入写操作指令 spi_tran(addrh); //高字节地址 spi_tran(addrl); //低字节地址 spi_tran(dat); //将数据写入前面指定的地址 cs=1; } uchar lc320_read(uchar addrl,uchar addrh)//读取25lc320字节 { uchar dat1; cs=0;nop(); spi_tran(0x03); //写入读操作指令 spi_tran(addrh); spi_tran(addrl); spi_tran(0X01); //写入任意数据 这句可以这样理解:前面地址写入后,对应空间 的数据被送到SSBUFF同时也写入了SSPSR,这时候从SDI写入数据来将SSPSR中需要的数据移出,因为是读取操作所以 写入的任意数据(如这里的0X01)是不会被写入到25lc320的,他的作用仅仅是帮助移位 cs=1; dat1=temp_dat; //读出需要的数据 return dat1; } |
|
相关推荐
|
|
我想问一下,关于PIC16F1823单片机SPI的问题,从机接收到命令后令I/O管脚变成高电平,但是又立马变成了低电平怎么回事?sum累加也是同样问题,但主机发送命令速度越快,清零的速度就越慢。
|
|
|
|
|
|
赞!!!!!!!!!!
|
|
|
|
|
|
学习了
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2077 浏览 1 评论
3505 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2333 浏览 2 评论
2760 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4015 浏览 5 评论
967浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6350浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 05:14 , Processed in 0.853834 second(s), Total 87, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号