[讨论] 关于X9241数字电位器的程序

依然听风   2011-8-20 00:05 楼主


各位大侠,帮忙看看下面这段控制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);
}

 

本帖最后由 paulhyde 于 2014-9-15 09:08 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复