单片机与12位DA进行SPI串行通信,在进行循环发送时,为什么发送16个时钟信号?

void set_dac(unsigned int vcon)
{
char i;
int svcon;
svcon=vcon|0x8000;
DAC_CS=0;///
for(i=0;i<16;i++)
{
DAC_DIN=svcon&0x8000;svcon<<=1;
DAC_CLK=0;
DAC_CLK=1;
}
DAC_CS=1;//禁止片选
return;
}
帮忙解释一下,谢谢!

第1个回答  2011-05-04
因为单片机的数据是8位的,12位的数据,也只能分成2个8位的来,只是其中有一个数据的前4位为0而已.你要把数据读完整,读12次的话,你得从低位开始读,也可以.
但是你要从高位开始读,因为高位前4位是0,你也要读,数据要读完整就必须得读16次了!
第2个回答  2011-05-04
没用过DA,但12位应该指的是转换有效位,但寄存器还是两个8位的吧,送16个bit 没问题,另外寄存器除了最高位必须1外,还有3位不知道有没有用到,即使没用的话,也应该完整送出两个字节追问

svcon=vcon|0x8000;
最高位应该是1,其次是0,但还是会被发送过去吧,这不会有影响吗?

追答

数据有效位是12,但总不可能做12位的片内寄存器吧?所谓有效位应该指16位数据里的低12位有效,而不是说只能放12位数据

第3个回答  2011-05-04
发送16个时钟信号是2个字节,12位DA,数据得按16位发送,高4位或低4位无效.追问

无效的怎么处理?

追答

发16位,DA转换只用12位,无效的位发时置0,DA转换没使用.不像A/D,你读回来16位,你左移或右移把多于的4位舍掉.

追问

svcon=vcon|0x8000;
按照上面的程序,最高位应该是1啊,这又是什么意思?难道DA寄存器的高四位没用吗?

追答

最高位是1是一数据标志位,DA寄存器的高四位没用.

追问

最高位必须是1吗?12位DA内部默认只使用低12位寄存器吗?还是通过编程实现的啊

追答

最高位必须是1,具体的编程明细,你得查芯片数据手册.

本回答被提问者采纳
第4个回答  2011-05-05
前四位为控制位,以max5312为例
CONTROL BITS DATA BITS
MSB LSB
C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
Table 1. Serial-Data Format
CONTROL BITS* INPUT DATA
C3 C2 C1 C0
D11–D0
FUNCTION
000 0 XXXXXXXXXXXX No operation; command is ignored.
001 0 12-bit DAC data Load input register from shift register; output unchanged.
010 0 12-bit DAC data Load input and DAC registers from shift register; DAC output updated.
011 0 XXXXXXXXXXXX Load D AC r eg i ster fr om i np ut r eg i ster ; D AC outp ut up d ated ; i np ut r eg i ster unchang ed .
100 0 XXXXXXXXXXXX Enter shutdown; input and DAC registers unchanged.
110 0 XXXXXXXXXXXX Exit shutdown; input and DAC registers unchanged.
第5个回答  2018-12-19
16位数据应该是包含了4个控制位和12个数据位的。具体你应该查看下芯片的数据手册。

单片机与12位DA进行SPI串行通信,在进行循环发送时,为什么发送16个时钟...
因为单片机的数据是8位的,12位的数据,也只能分成2个8位的来,只是其中有一个数据的前4位为0而已.你要把数据读完整,读12次的话,你得从低位开始读,也可以.但是你要从高位开始读,因为高位前4位是0,你也要读,数据要读完整就必须得读16次了!

为什么我的spi能发送数据,但数据发送的不对啊
时序不对!启动和停止的时候,数据位与时钟位的电平最好置高,然后数据的传输速率也得注意,另外有些I\/O口的输出要注意有上拉电阻。如果单片机有自带的SPI功能的话,你就要看看配置了~希望可以帮到你

为什么用单片机的spi通信时cs的波形与时钟的信号一样
SPI通讯波形在示波器上看应该是矩形波,所以在采样菜单中将获取方式改成峰值检测,在触发菜单中将触发类型改成脉冲触发然后设置触发条件,这样更容易捕捉到矩形波。如果还看不到就不是示波器设置问题了,检查电路或者探头连接对不对。

单片机的问题。串行通信和串行扩展技术什么关系?  
RS232是电气协议,规定发送和接收都是一根线, 因为没有同步时钟,所以叫异步通信, 异步通信就一定要定好波特率, 规定起始位结束位, 高电平要转换成0~-12V,低电平要转换成5~12V,才会被对方识别,RS485呢也是只用两根线,没有时钟,但它是半双工的,也就是发送时不能接收,接收时不能发送,高电平要求是A...

使用SPI接口读取从机的数据时,主机为什么要发送数据?
因为读数据也要主机发出时钟,一般的SPI口主机,发送一个数据的时候才会启动时钟,所以要发数据咯。你如果可以单独启动时钟,就可以不发也能收到了。

DSP28335的SPI发送的是16位的数据,我怎么发送给单片机8位的SPI,单...
你可以将单片机SPI设定为主模式,而将DSP28335的SPI设定为从模式,主模式工作时是单片机发时钟给DSP,DSP根据时钟信号一位一位的传送数据。单片机发完一字节可以先行处理接收的8位数据,完之后再接收下一个8位。

单片机模拟的SPI口,一次只能发一个字节吗?为什么?我有13位可以一次发送...
SPI只是一种协议,是发送方和接收方双方约定的发送接收方式。单片机模拟SPI,当然可以发送任意数据,13位当然也可以一次发送完。但这时,要考虑接收方的设置,是不是可以一次接收13位数据。

单片机spi通信的问题
对于C8051F330而言,你需要设置好SPI的时序,极性以及空闲时的状态,一般在送完一个字节后,要等待spi中断后,在能进行第二次送数据 我截取部分程序给你看看 void SPI_INT(void) \/\/SPI初始化 { SPI0CFG=0x40;SPI0CN=0x01; \/\/0000 0001最后一位是SPI使能位 SPI工作在三线主方式 SPI0CKR=0x0f...

单片机模拟SPI时钟控制
比如说单片机像一个有SPI接口的LED驱动发数据时,先将SCK送低电平,然后送一位数据到mosi,这时,把SCK送一,然后再送0,就实现了一个上升沿并为下一个上升沿做准备。如此往复,知道8位数据送完。当单片机要读数据时,数据是在MISO引脚上的,这时,把SCK拉高,然后再拉低,数据就会出现在MISO引脚上...

8位SPI单片机怎么和16位的SPI外设同步
时钟相同就可以。SPI通信发送数据的时候都是是单个字节(8位)发送和接收。接收和发送16位的数据,他也会分成两个字节来进行。就是你的MCU接收两次

相似回答