#include"..\inc\headfile.h"
#define AT91C_EEPROM_I2C_ADDRESS (0x56<<16)
int AT91F_TWI_Write(const AT91PS_TWI pTwi ,int drivers,int address, char *data2send, int size)
{
unsigned int status;
//pTwi->TWI_MMR=(AT91C_EEPROM_I2C_ADDRESS| AT91C_TWI_IADRSZ_2_BYTE ) & ~AT91C_TWI_MREAD;//设置TWI工作模式,写
pTwi->TWI_MMR=(drivers) & ~AT91C_TWI_MREAD;//设置TWI工作模式,写
pTwi->TWI_IADR = address; //设置从机要访问的内部地址
status = pTwi->TWI_SR; //读取TWI状态寄存器
pTwi->TWI_THR = *(data2send++); //把第一个数据加载到发送保持寄存器
pTwi->TWI_CR = AT91C_TWI_START; //启动TWI的START
while (size-- >1)
{
while (!(pTwi->TWI_SR & AT91C_TWI_TXRDY)); //等待TWI_THR为空
pTwi->TWI_THR = *(data2send++); // 把数据加载到发送保持寄存器
}
pTwi->TWI_CR = AT91C_TWI_STOP; //启动TWI的STOP
status = pTwi->TWI_SR; //读取TWI的状态寄存器
while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP)); // 等待发送完成
return 0;
}
int AT91F_TWI_Read(const AT91PS_TWI pTwi ,int drivers,int address, char *data2rec, int size)
{
unsigned int status; //int drivers;
//pTwi->TWI_MMR=(AT91C_EEPROM_I2C_ADDRESS| AT91C_TWI_IADRSZ_2_BYTE ) | AT91C_TWI_MREAD;//设置TWI工作模式,读
pTwi->TWI_MMR=(drivers) | AT91C_TWI_MREAD;//设置TWI工作模式,读
pTwi->TWI_IADR = address; //设置从机要访问的内部地址
pTwi->TWI_CR = AT91C_TWI_START; // Start transfer
status = pTwi->TWI_SR; //读取TWI状态寄存器
while (size-- >1)
{
while (!(pTwi->TWI_SR & AT91C_TWI_RXRDY)); //等待TWI_RHR为空
*(data2rec++) = pTwi->TWI_RHR; //读取数据
}
pTwi->TWI_CR = AT91C_TWI_STOP; //启动TWI的STOP
status = pTwi->TWI_SR; //读取TWI的状态寄存器
while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP)); // 等待发送完成
*data2rec = pTwi->TWI_RHR; // 读取最后一个数据
return 0;
}
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;
pTwi->TWI_CWGR = 0x00010000 | sclock | (sclock << 8);
}
void InitTwi(void)
{
AT91F_TWI_CfgPIO(); //配置TWI的TWD和TWCK管脚
AT91F_TWI_CfgPMC (); //使能TWI外围时钟
AT91F_TWI_Configure (AT91C_BASE_TWI); //将TWI设置成主模式
AT91F_SetTwiClock(AT91C_BASE_TWI); //计算、设置时钟发生寄存器
}