max5477是数字电位器,10K的,接口是IIC接口。其他的不多说了自己看datasheet。
严格按照说明书的时序要求,先是IIC启动,然后发送器件地址字节,接下来接收应答位,
然后再发送控制字节,然后再接收应答位,然后发送数据字节,接收应答位,然后IIC停止。按照这个时序,芯片就可以正常使用了。写函数如下。
void MAX5477_Write(u8 address,u8 command,u8 data)
{
MAX5477IIC_Start();
MAX5477IIC_Send_Byte((address<<1)|0x50); //发送器件地址
MAX5477IIC_Wait_Ack();
MAX5477IIC_Send_Byte(command); //发送命令
MAX5477IIC_Wait_Ack();
MAX5477IIC_Send_Byte(data);
MAX5477IIC_Wait_Ack();
MAX5477IIC_Stop();//产生一个停止条件
Delay_ms(10);
}
void MAX5477_Write(0x00,0x13,0x12);
但是我在调试过程中MAX5477的电阻怎么都不变化。郁闷了好几天。后来发现时编译器优化的原因。
我使用IAR开发环境,优化使用最高级。见图片。
结果MAX5477.C文件在编译成汇编语言的时候,对一些语句进行了优化,就破坏了IIC通信时序,所以芯片没有正常工作。
SCL -------PB11 #define PB11_Out ( *((u32*)
0x422181ac)) 注意标红和标蓝的寄存器地址。
SDA-------PB12
#define PB12_Out ( *((u32*)0x422181b0)) 注意标红和标蓝的寄存器地址。
我们看看Low优化级别和High优化级别,生成的汇编代码有啥区别。option-》C/C++Compile-》List,中选择输出汇编文件。然后在工程目录下找到MAX54477.S文件就行了。
我们可以看到19条和20条语句,在不同优化级别下,生成的汇编代码不同,也同时看出,低优化的时候,每次都是重新将地址复制给寄存器,
然后对寄存器赋值,高优化的时候是将一个小点的地址赋值给R4,然后利用R4+4,达到操作大点地址寄存器的目的,也许是在这个工程中,改变了R4的值,使得IIC时序不对,或者这样优化,影响了其他地方,反正具体那个地方影响了,我也没有找到。
将IAR开发环境优化级别降到low,芯片就可以正常工作了。中等的优化级别也不行的。
阅读(2168) | 评论(0) | 转发(0) |