Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2259119
  • 博文数量: 187
  • 博客积分: 1457
  • 博客等级: 上尉
  • 技术积分: 2423
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-13 09:41
个人简介

如需要绘制PCB,设计电路可以和我联系。sunhenu@163.com.

文章分类

全部博文(187)

文章存档

2017年(2)

2016年(2)

2015年(7)

2014年(13)

2013年(80)

2012年(83)

分类: 嵌入式

2015-03-05 15:05:45

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,芯片就可以正常工作了。中等的优化级别也不行的。

阅读(2093) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~