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