关于上次说的要改程序的问题,
//读ADXL345寄存器
//addr:寄存器地址
//返回值:读到的值
u8 ADXL345_RD_Reg(u8 addr)
{
u8 temp=0;
IIC_Start();
IIC_Send_Byte(ADXL_WRITE); //发送写器件指令
temp=IIC_Wait_Ack();
IIC_Send_Byte(addr); //发送寄存器地址
temp=IIC_Wait_Ack();
IIC_Start(); //重新启动
IIC_Send_Byte(ADXL_READ); //发送读器件指令
temp=IIC_Wait_Ack();
temp=IIC_Read_Byte(0); //读取一个字节,不继续再读,发送NAK
IIC_Stop(); //产生一个停止条件
return temp; //返回读到的值
}
这段写寄存器代码,不理解temp为什么要被频繁的赋值,去掉后,宏观看来对结果没有影响。第二个不理解的地方是为什么在发送寄存器地址之后要从新启动一次,因
为在相似的写寄存器函数中,在相同的位置不存在重启代码。注释掉该句之后显示“ADXL345 error”。
这两天主要看了三轴加速度计的程序,虽然例程里的能看懂,但是在四轴里的程序却不那么容易,我甚至不明白为什么他要自己写一个iic的函数,我打算接下来把它的
程序和例程里的程序对照来看,看能不能找到什么头绪。
下面是对以前学过内容的总结:
对位的寻址操作
为了实现对SARM、I/O外设空间中某一位的操作,在寻址空间(4GB)另一地方取个别名区空间,从这地址开始,每一个字(32bit)就对应SRAM或I/O的一位。即原来每
个字节用一个地址,现在给字节中的每个位一个地址,实现了对位的寻址。
spi与iic之间各自的优劣
1 硬件连接的优劣
SPI是[单主设备( single-master )]通信协议,这意味着总线中的只有一支中心设备能发起通信。当SPI主设备想读/写[从设备]时,它首先拉低[从设备]对应
的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,[主设备]把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”。
主从设备必须使用相同的工作参数——SCLK、CPOL 和 CPHA,才能正常工作。如果有多个[从设备],并且它们使用了不同的工作参数,那么主设备必须在读写不同从设
备间重新配置这些参数。
I²C 是多主设备的总线,I²C没有物理的芯片选择信号线,没有仲裁逻辑电路,只使用两条信号线—— „serial data‟ (SDA) 和 „serial clock‟ (SCL)。
从上面的分析可以看出,在需要多个从设备的时候,iic比spi需要更少的信号线。
2 速度比较
spi为全双工,速度可以达到10M,而iic快速模式为1M,需要额外I/O缓冲区的高速模式也才3.4M。
3 总结
I²C的优点在于它的特色——用很轻盈的架构实现了多主设备仲裁和设备路由。但是对使用的工程师来讲,理解总线结构更费劲,而且总线的性能不高。
SPI的优点在于-------它的结构相当的直观简单,容易实现,并且有很好扩展性。SPI的简单性不足称其优雅,因为要用SPI搭建一个有用的通信平台,还需要在SPI之上构建特定的通信协议软件。也就是说要想获得SPI特有而IIC没有的特性——高速性能,工程师们需要付出更多的劳动。另外,这种自定的工作是完全自由的,这也说明为什么SPI没有官方标准。I²C和SPI都对低速设备通信提供了很好的支持,不过,SPI适合数据流应用,而I²C更适合“字节设备”的多主设备应用。