本帖最后由 paulhyde 于 2014-9-15 09:08 编辑
各位大侠,帮忙看看下面这段控制X9241数字电位器的程序为什么不出结果?我用的是AVR自带的I2C,延时函数和uchar等定义我已经写在头文件里了。。
#include <iom16v.h> #include <macros.h>
#define START 0X08 //start已发送 #define MT_SLA_ACK 0X18 //发送地址后的应答 #define MT_DATA_ACK 0X28 //发送数据后的应答
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //产生START信号 #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //产生STOP信号 #define Wait() while(!(TWCR&(1<<TWINT))) //等待当前操作完成 #define TestACK() (TWSR&0xF8) //取出状态码,即检测应答 #define SetACK() (TWCR|=(1<<TWEA)) //产生ACK(应答) #define Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1<<TWINT)|(1<<TWEN);} //发送一个字节(twi_d为写入的数据或地址)
void twi_init() { TWBR=0X20; //比特率寄存器,比特率设置 TWSR=0X02; //状态寄存器清零、预分频为16 TWCR=0X44; //控制寄存器,使能TWI和TWI应答 } uchar x9241_writeB(uchar devadd,uchar cmd,uchar rdata) { Start(); Wait(); if(TestACK()!=START) { return 0; } Writebyte(devadd); //写地址 Wait(); if(TestACK()!=MT_SLA_ACK) { return 0; } Writebyte(cmd); //写指令 Wait(); if(TestACK()!=MT_DATA_ACK) { return 0; } Writebyte(rdata); //写数据 Wait(); if(TestACK()!=MT_DATA_ACK) { return 0; } Stop(); delaynms(10); return 1; }
void main() { DDRC|=BIT(PC0)|BIT(PC1); twi_init(); x9241_writeB(0,0XA0,30); while(1); }
|