||
其中clk用spi的sck,SDI用MOSI ,这是oled和dac7611共用了的,其他引脚不共用。
写好程序后,发现DAC7611输出不正确,虽然oled和dac7611各自的片选都有用到,且把spi频率降低了很多,但DAC7611输出依然不正确,有时总会出现一个固定数据。
可能是复用的过程中oled的程序导致了spi某些标志位没有复位,影响到了DAC7611,其中mega16手册中有下图一段话:
串行发送结束后,SPIF置位,并且硬件中断自动清零,或者读SPSR和访问SPCR可以清零,由于程序中没有使能SPI中断,所以单片机给oled在数据发送结束后,SPIF没有清零,仅仅是拉高了片选,导致后面驱动DAC7611时7611输出不正常值,所以应该在oled读写数据函数中先清零SPIF,在DAC7611的程序中也先加入清零SPIF,后来加写了访问SPCR和SPDR的程序,如下
uchar value1;
value1=SPSR;
value1=SPDR;
dac7611正常输出,更改程序前后对比如下:
其中由于使用了HCPL0631隔离dac7611,并使用了三极管开关电路,导致spi的速率不能太高,应保持250k以下,如下