废话少说了 先谈谈SPI
同步串行通信:需要一个CLK控制数据传输,异步不需要
AVR有硬件SPI接口:好处是快,而且有中断,模拟的只能查询使用多个单片机需要设定主从机。
硬件方面:PB4(ss)为设定从机的,PB5(MISI)为发送数据,PB6(MISO)接受数据的,PB6(CLK)时钟控制
SPI:
*1
寄存器 SPCR (控制寄存器)
7
6
5
4
3
2
1
0
SPIE
SPE
DORD
MSIR
CPOL
CPHA
SPR1
SPR0
SPI中断使能 使能SPI
数据次序 主从选择 时钟级性
时钟相位 和SPI2X决定采集的速率
1
0
DORD 为1低位先发送,为0高位先发送
MSIR 为1主机模式
为0从机模式
CPOL 为1sck空闲高电平 0为低电平
CPHA 为1上升沿采集数据 0下降沿采集
SPI2X
SPR1
SPR0 决定采集的速率的 ,可以看时钟频率选择的分频表确定
SPI2X在状态寄存器中
*2寄存器 SPSR(控制寄存器)
7
6
5
4
3
2
1
0
SPIF WCOL —
— - _
-
SPi2x
中断标志 写碰撞
速率
SPIF 数据发送后, SPIF为置1
-----可用查询这位来确定是否发送完成
*2寄存器 SPDR(数据寄存器)
数据传输模式
DA,AD原理我在这里就不讲了主要讲应用
指标分辨率和精度,分辨率由位确定,并非分辨率越高精度就越高,另外要注意转换时间
这里用了DA芯片AD5300(倒了居然这样命名)
对照为低有效,按照空闲位置为低电平,采集数据为下降沿,可以选对应的相应的时钟选择表设定单片机的spi
然后就要交互数据了,首先需要有数据的格式吧,AD5300为16位一个数据的方式,具体可参见手册
写程序
先对spi初始化,对应的控制脚为输出,时钟和输出的数据线,使能芯片
接着对单片机写spi控制 0x57
128分频,高位先发送
对应16位放在了****DDDD DDDD****
故需要转换下,讲一个数据的高4为右移,放在高8字节,低4位左移,放在低8字节就可以发送了,还需注意要将查询用的spsr(状态寄存器)置0
发送时先发高位数据,再发低位的 判断是否发完,用了do
while()执行查询spsr接while也可以,发好了要关闭芯片使能 芯片低电平工作,这里置高就关了