近日写一个DA的驱动,用的是12位DA芯片MAX5812,芯片上标为AAYZ(对应地址0xA8),调试了好久一直无电压输出。 其中用的51系列单片机做仿真I2C接口,上拉电阻Rp为10K,串行电阻为10欧,SDA、SCL高电平为5V;VDD接MAX6045的输出端,也就是4.5V;ADD接地,都是按照手册上所说的接的,用示波器看SCL和SDA的波形都是正确的,芯片也换过了,两个芯片都是一样的效果,一直没有电压出来,不知道是何缘故,现附上这一段的代码,麻烦各位高人看看有什么问题没有,感激不尽!
#include<reg51.h> #include<absacc.h> #include<intrins.h>
#define uchar unsigned char #define uint unsigned int
sbit SCL=P2^7; sbit SDA=P2^6;
bit cack; uint value;
void delayms(uint m) { uint j; uint i; for(i=0;i<m;i++) for(j=0;j<600;j++) _nop_(); }
void delay2ns() { _nop_(); _nop_(); }
void delay4ns() { _nop_(); _nop_(); _nop_(); _nop_(); }
void Start() { SDA=1; SCL=1; delay4ns(); SDA=0; delay4ns(); SCL=0; delay4ns(); }
void Stop() { SDA=0; delay4ns(); SCL=1; delay4ns(); SDA=1; }
void Writebyte(uchar byte) { uchar i; for(i=0;i<8;i++) { SDA=(bit)(byte&0x80); delay4ns(); SCL=1; delay4ns(); SCL=0; delay4ns(); byte<<=1; } delay4ns(); }
void Sent_ack() { SDA=0; delay4ns(); SCL=1; delay4ns(); SCL=0; delay4ns(); }
void Sent_noack() { SDA=1; delay4ns(); SCL=1; delay4ns(); SCL=0; delay4ns(); }
void Wait_ack( ) { SCL=0; SDA=1; delay4ns(); SCL=1; delay4ns(); cack=SDA; while(cack) { cack=SDA; } SCL=0; SDA=1; delay4ns(); }
main() { SCL=1; SDA=1; value=0x0AAA; delayms(500); while(1) { //presskey(); Start(); Writebyte(0xA8); Wait_ack(); Writebyte((value>>8)|0xC0); Wait_ack(); Writebyte(value&0x00FF); Wait_ack(); Stop(); delayms(100); }
}
相关链接:https://bbs.21ic.com/upfiles/img/200812/200812181756444.pdf |