标题:
ARM开发调试笔记心得(转)(7)
[打印本页]
作者:
yuyang911220
时间:
2015-2-27 13:32
标题:
ARM开发调试笔记心得(转)(7)
//*----------------------------------------------------------------------------
//* n 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的初始化函数,然后进入了超级大循环。在每次写和读时,都对它们的数据缓冲区进行初始化,以查看读、写的正确性。
#include "board.h"
#include "twi.h"
int main ( void )
{ int loop,index=0;
char Wri_data[16], Red_data[16]; //定义写和读缓冲区
InitTwi(); //TWI初始化
while (1)
{ for (loop = 0; loop < 16; 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)。
USB 设备实验
一.背景
在ATMEL官方网站上提供了USB的应用例子(详情请参考“BasicUSB Application”说明),里面有源代码(是用IAR编译的,需要稍作修改才能用在ADS上),两个不同的USB驱动程序。两个不同的USB驱动程序,在PC机上是两个不同的应用例子。当安装完两个不同的驱动后,一个出现的是调制解调器的设备,可以用超级终端来完成USB数据的收发。另一个是USB设备,用ATMEL提供的“BasicUSB_6124.exe”来完成USB数据的收发。我起初一直在用后面的例子来做实验,但试了很久都没有成功,后来改用前面的成功了。
二.USB驱动安装说明
当第一次与host PC机连接时,系统会弹出一个“找到新的硬件向导”窗口,选择“从列表或指定位置安装”后点击“下一步”。在接下来的窗口中选择“不要搜索。我要自己选择要安装的驱动程序”,然后点击“下一步”。再在接下来的窗口中点击“从磁盘安装”,找到“atm6124ser.inf”所在的目录后打开。再点击“下一步”开始安装,最后点“完成”就可以。
安装完成后,会在设备管理器的“调制解调器”栏中查看到“ATMEL AT91 USB serial emulation #2”设备。此时就可以使用“超级终端”通过USB与AT91SAM7S64通讯了。详请请查看该目录的“BasicUSB Application.pdf”文件。
三.实验目的
用PC机上的超级终端发送数据,AT91SAM7S64通过USB接收超级终端上发过来的数据(USB的读操作),再通过USB将接收到的数据返回给PC机上的超级终端(USB的写操作),这样就完成了PC机与AT91SAM7S64的USB通讯。如果AT91SAM7S64将接收到数据通过DBUG串口再发送出去,这样AT91SAM7S64就可以当作一个USB转串口的设备使用。
四.实验源程序
由于这个实验的源程序比较多,且ATMEL提供了详细的文档和源代码,故不再列出。
另外因为ATMEL的源码中没有使能重映射功能,如果想将程序下载到地址为0x00200000的SRAM中调试,又要使用在0x0地址空间的中断向量表,使程序跳转到中断处理程序,必须使用重映射的功能。所以我在起动代码(AT91F_LowLevelInit)中加了重映射这条命令,如下:
if (Remap_Flag == 0)
{ //由于不能重复执行重映射命令,所以加了Remap_Flag标志来避免多次执行重映射命令
Remap_Flag = 0xff;
*AT91C_MC_RCR = AT91C_MC_RCB; //Remap Command Bit
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0