天然气缓蚀剂厂家
免费服务热线

Free service

hotline

010-00000000
天然气缓蚀剂厂家
热门搜索:
技术资讯
当前位置:首页 > 技术资讯

ARM入门笔记(9) 免费猫

发布时间:2020-02-17 14:03:27 阅读: 来源:天然气缓蚀剂厂家

ARM入门笔记(9)

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

//* \brief 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

//* \brief 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)。

众神小故事

致富故事

神墓小说全文免费阅读

月宴种植技术