ARM入门笔记(9)

发布者:cwm6269310最新更新时间:2015-04-20 来源: eechina关键字:ARM  入门笔记  I2C 手机看文章 扫描二维码
随时随地手机看文章
 I2C接口实验

注:在AT91SAM7Sxx系列中,I2C称作TWI。

一.实验目的

能够正确读写I2C接口芯片存储器(24C02),即写入24C02的数据与读出来的数据相同。

二.实验程序和参数设置

1> 连接器选项设置和启动代码与上一个实验相同
2> I2C驱动程序

ATMEL官方网站上有这方便的参考程序。主要由I2C接口的初始化、I2C的读和写三部分组成。

#i nclude "board.h"
#i nclude "twi.h"
void InitTwi(void)
{ AT91F_TWI_CfgPIO();      //配置TWI的TWD和TWCK管脚 AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,(unsigned int)AT91C_PA3_TWD);  
AT91F_TWI_CfgPMC ();      //使能TWI外围时钟
AT91F_TWI_Configure (AT91C_BASE_TWI);  //将TWI设置成主模式
AT91F_SetTwiClock(AT91C_BASE_TWI);   //计算、设置时钟发生寄存器
}
//*----------------------------------------------------------------------------
//* fn    AT91F_SetTwiClock
//*计算、设置TWI时钟发生寄存器
//*----------------------------------------------------------------------------
void AT91F_SetTwiClock(const AT91PS_TWI pTwi)
{ int sclock;
sclock = (10*MCK /AT91C_TWI_CLOCK);
sclock = (MCK /AT91C_TWI_CLOCK);
if (sclock % 10 >= 5)
  sclock = (sclock /10) - 5;
else
sclock = (sclock /10)- 6;
sclock = (sclock + (4 - sclock %4)) >> 2; // div 4
    pTwi->TWI_CWGR = 0x00010000 | sclock | (sclock
}
//*----------------------------------------------------------------------------
//* fn    AT91F_TWI_Write
//* rief Send n bytes to a slave device
//*----------------------------------------------------------------------------
int AT91F_TWI_Write(const AT91PS_TWI pTwi ,int address, char *data2send, int size)
{ unsigned int status;
pTwi->TWI_MMR=(AT91C_EEPROM_I2C_ADDRESS| AT91C_TWI_IADRSZ_1_BYTE ) & ~AT91C_TWI_MREAD;  
pTwi->TWI_IADR = address; // Set TWI Internal Address Register
status = pTwi->TWI_SR;
pTwi->TWI_THR = *(data2send++);
pTwi->TWI_CR = AT91C_TWI_START;
while (size-- >1){  // Wait THR Holding register to be empty
  while (!(pTwi->TWI_SR & AT91C_TWI_TXRDY));
  pTwi->TWI_THR = *(data2send++);// Send first byte
}
pTwi->TWI_CR = AT91C_TWI_STOP;   
status = pTwi->TWI_SR;
while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP)); // Wait transfer is finished   
return AT91C_EEPROM_WRITE_OK;
}
//*----------------------------------------------------------------------------
//* fn    AT91F_TWI_Read
//* rief Read n bytes from a slave device
//*----------------------------------------------------------------------------
int AT91F_TWI_Read(const AT91PS_TWI pTwi , int address, char *data2rec, int size)
{ unsigned int status;  
pTwi->TWI_MMR=(AT91C_EEPROM_I2C_ADDRESS|AT91C_TWI_IADRSZ_1_BYTE) | AT91C_TWI_MREAD; // Set the TWI Master Mode Register
pTwi->TWI_IADR = address; // Set TWI Internal Address Register
pTwi->TWI_CR = AT91C_TWI_START; // Start transfer
status = pTwi->TWI_SR;
while (size-- >1){ // Wait RHR Holding register is full
  while (!(pTwi->TWI_SR & AT91C_TWI_RXRDY));  
  *(data2rec++) = pTwi->TWI_RHR; // Read byte
}
pTwi->TWI_CR = AT91C_TWI_STOP;
status = pTwi->TWI_SR;
    while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP)); // Wait transfer is finished
*data2rec = pTwi->TWI_RHR; // Read last byte
return AT91C_EEPROM_READ_OK;
}

3> 主函数

在主函数中,首先调用了TWI的初始化函数,然后进入了超级大循环。在每次写和读时,都对它们的数据缓冲区进行初始化,以查看读、写的正确性。

#i nclude "board.h"
#i nclude "twi.h"
int main ( void )
{ int loop,index=0;
char Wri_data[16], Red_data[16];  //定义写和读缓冲区
InitTwi();      //TWI初始化
while (1)
{ for (loop = 0; loop 初始化写和读缓冲区的内容
   data1[loop] = loop + index;
   data2[loop] = 0;
  }
  index += 1;
  AT91F_TWI_Write(AT91C_BASE_TWI, 0x0, Wri_data, EEP_RW_CHK_CNT);//写
  AT91F_TWI_Read(AT91C_BASE_TWI, 0x0, Red_data, EEP_RW_CHK_CNT);//读
}//用单步调试,可比较Wri_data[16]和 Red_data[16]的内容来判断读写是否正确。
}

三.出现的问题与解决方法

1> 无论写入任何数据,读出来都是同样的数,表明数据没有写入(在调试时对其写操作,器件没有产生应答)。

原因是24C02的写保护管脚没有接地,内部的数据被写保护了。注意:有些厂家的EEROM的该管脚处于悬空时为不保护状态,而有些厂家的EEROM会处于保护状态,因此在用之前一定要仔细阅读厂家的数据手册,或不要将该脚悬空。

2> 对24WC02写的数据和读的数据不一样。

原因是I2C的时钟太快。在本实验程序中,可以减少twi.h中的AT91C_TWI_CLOCK常量的数值。或者直接在程序中修改TWI时钟波形发生寄存器TWI_CWGR。

3> 当写入16字节数据,再读出16字节数据时,最后一个字节总为0。

原因是TWI Master Mode Register的IADRSZ(器件内部地址长度)设成了两个字节(Two-byte),要将改成一个字节(One-byte)。
关键字:ARM  入门笔记  I2C 引用地址:ARM入门笔记(9)

上一篇:ARM入门笔记(10)
下一篇:ARM入门笔记(8)

推荐阅读最新更新时间:2024-03-16 13:59

elmos推出具备I2C总线接口的双天线电源芯片
         德国多特蒙德,艾尔默斯公司(elmos)日前宣布推出一种紧凑型封装的汽车级双天线电源保护芯片。该芯片为天线系统提供静电保护(ESD保护)以及电源对地/电池的短路保护,同时该芯片具备过热保护的功能。通过I2C总线接口,可以非常方便的通过两根数据线对多个不同的器件进行寻址。该芯片采用QFN20L5封装。       该芯片可以用在输入电压从4.5V-25V的天线应用中。芯片把输出端的电压通过电阻分压,然后反馈到芯片内部作为调整的依据,可以独立地输出两路电源,电压范围从3.3 V直至至VBat。       采用QFN的封装形式,使得芯片体积可以做的很小,但却具有全面的诊断功能。由于它采用I2C接口和8位ADC
[电源管理]
elmos推出具备<font color='red'>I2C</font>总线接口的双天线电源芯片
化敌为友 英特尔拟为ARM生产芯片
  据外媒报道, 英特尔 为其他公司代工芯片的业务使得它与传统竞争对手的合作越来越多。下面就随网络通信小编一起来了解一下相关内容吧。   这家全球最大的芯片制造商投资了100亿美元打造了一个大型芯片工厂,它自然需要确保这个工厂能够满负荷运转。为其他公司生产芯片,将能够确保它的工厂得到充分利用。随着 英特尔 自己的PC电脑芯片的需求量逐渐萎缩,该公司有必要寻找更多的新的合作伙伴,以充分利用其芯片工厂的生产能力。   这意味着 英特尔 将会与 ARM 进行合作。多年来,在芯片设计方面, ARM 一直是英特尔的竞争对手。 ARM 的芯片设计可以让英特尔的竞争对手用来打造自己的产品。但是现在,ARM芯片将很快会在英特尔的工厂进行生产。在
[网络通信]
stm32之i2C硬件驱动ht16c22
使用硬件i2c,驱动ht16c22,程序不稳定是肯定的,还是贴出来吧,项目中最好不要用。 文件i2c.h内容: #ifndef _STM32F103_I2C_H_ #define _STM32F103_I2C_H_ #include stm32f10x.h #define SlaveAddress 0x7e //0x7e //#define ModeSet 0b10001100 //80Hz,turn on sys and LCD bias,1/3 bias #define ModeSet 0x8C //80Hz,turn on sys and LCD bias,1/3 bias //#define VlcdAdjus
[单片机]
ARM的7种运行模式和37个寄存器
ARM的7种工作模式 包括用户模式和特权模式二大类,其中特权模式又分为系统模式和异常模式。CPU每次只能运行在一种工作模式下,各种模式之间的切换可以是程序员通过代码主动切换(通过程序状态寄存器CPSR)也可以是CPU自己在某种情况下自动切换。在每种模式下最多只能看到18个寄存器,其他的寄存器虽然名字相同但是在当前模式下都不可见。由于操作系统有安全级别的需要,因此CPU设计多种模式是为了满足操作系统的多种角色安全等级的需要。 用户模式(USR): 非特权模式,ARM处理器正常执行状态都在这种模式。 系统模式(SYS):运行具有特权操作系统任务。 快速中断模式(FIQ):Fast Interrupt Request,用于高速数据传
[单片机]
<font color='red'>ARM</font>的7种运行模式和37个寄存器
ARM的起点是移动设备而终点是企业市场
移动设备的兴起,最受益的非ARM莫属。ARM宣布其合作伙伴在2013年ARM架构芯片的总出货量超过100亿颗,这是ARM非常有标志性的一年。还有一个更大的值得庆祝的数字:自1991年成立后,ARM处理器的历史累计出货了已经突破了500亿颗! ARM推出的处理器主要面向移动、嵌入式、企业及家庭四个领域。其中移动市场毫无疑问的占据了最大的份额,高达58%。其次是嵌入式市场,占据了20%的市场份额,这个市场包括各种SSD、HDD主控以及手机基带也适用了ARM架构。 值得一提的是企业级市场,这里可能会跟大家的认识有较大差别,我们一般指的企业级市场多指服务器CPU,不过ARM这里的企业级市场其实包含了路由器以及无线AP等设备
[单片机]
第23章 I2C—读写EEPROM—零死角玩转STM32-F429系列
本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》及《I2C总线协议》。 若对I2C通讯协议不了解,可先阅读《I2C总线协议》文档的内容学习。若想了解SMBUS,可阅读《smbus20》文档。 关于EEPROM存储器,请参考 常用存储器介绍 章节,实验中的EEPROM,请参考其规格书《AT24C02》来了解。 23.1 I2C协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的
[单片机]
第23章 <font color='red'>I2C</font>—读写EEPROM—零死角玩转STM32-F429系列
STM32 硬件I2C EEPROM命令解析
void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite) { u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0; //写入地址是每页的第几位 Addr = WriteAddr % I2C_PageSize; //在开始的一页要写入的个数 count = I2C_PageSize - Addr; //要写入的页数 NumOfPage = NumByteToWrite / I2C_PageSize; //不足一页的个数 Nu
[单片机]
基于ARM的MPEG4视频解码器
1 引 言 本文旨在研究基于arm微处理器的MPEG-4视频解码技术,主要应用在手持移动设备中。利用嵌入式系统实现MPEG-4视频解码,处理器的选择是关键。在嵌入式系统中常用的RISC处理器是ARM核,主要是因为它具有体积小,功耗低,成本低,性价比高的特点,这对于移动应用领域非常重要。ARM7系列微处理器为低功耗的32位RISC处理器,最适合于对价位和功耗要求较高的消费类应用。本解码器定位于低分辨率和低帧率的应用场合,因此选择在arm7TDMI核上实现解码功能。要实现更高帧率和分辨率的解码,可将软件直接应用在更高端的处理器上。 2 MPEG-4视频解码算法的优化与实现 MPEG-4标准可以划分为一套子标准,标准的每一
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved