在线时间151 小时
UID3129923
注册时间2015-5-21
NXP金币0
该用户从未签到
高级会员
- 积分
- 722
- 最后登录
- 2016-1-9
|
接上次RTC中断翻转LED实验:https://www.nxpic.org.cn/module/forum/thread-600274-1-1.html
本次所做实验为IIC读写EEPROM,即24C02。由于之前在51上模拟过IIC,对时序方面还有印象,所以本次实验难度不大。
下面是源程序:
主程序:
for (i = 0; i < 8; i++) { /* 数组初始化 */
ucData = i;
printf("Data = %d \r\n" , ucData); /*将要写入EEPROM的数据在串口上显示*/
}
printf("Now Start Write ...\r\n");
I2C0WriteMultiRegister(EEPROM_I2C_ADDRESS, 0x00, ucData,8); /*将数据写入EEPROM*/
for (i = 0; i < 8; i++) { /* 数组初始化 */
ucData = 0;
}
printf("Now Start Read...\r\n");
j = I2C0ReadMultiRegisters(EEPROM_I2C_ADDRESS, 0x00, 8,ucData); /*读取EEPROM中的数据*/
printf("DummyRead = %d\r\n",j);
for (i = 0; i < 8; i++) {
if (ucData != i) {
GPIO_TOGGLE(MKL_PORTB,19); /* 验证失败,D6亮 */
printf("ERR!");
while (1);
}
}
GPIO_TOGGLE(MKL_PORTD,1); /* 验证正确,D7亮 */
printf("OK!");
while(1);
IIC初始化:
void init_I2C(void)
{
SIM_SCGC5 = SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK;
SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK; //开启IIC时钟
/* 配置I/O口为IIC功能*/
PORTC_PCR10 = PORT_PCR_MUX(2);
PORTC_PCR11 = PORT_PCR_MUX(2);
I2C1_F = 0x16; // 配置IIC时钟频率
I2C1_C1 = I2C_C1_IICEN_MASK; /* 使能 IIC */
}
IIC读写选择:
void IIC0_StartTransmission (unsigned char SlaveID, unsigned char Mode)
{
if(Mode == MWSR)
{
/* 设置为读*/
MasterTransmission = MWSR;
}
else
{
/* 设置为写 */
MasterTransmission = MRSW;
}
/* 配置从机为相应读写 */
SlaveID = SlaveID << 1;
SlaveID |= (unsigned char)MasterTransmission;
/* 启动操作 */
i2c0_Start();
/* 写器件地址*/
i2c0_write_byte(SlaveID);
}
IIC写操作:
void I2C0WriteMultiRegister(unsigned char SlaveAddr, unsigned char u8RegisterAddress, unsigned char *u8Data, unsigned int length)
{
uint16 i;
/* 写从机地址&写操作 */
IIC0_StartTransmission(SlaveAddr,MWSR);
i2c0_Wait(); //等待写入完成
I2C0_D = u8RegisterAddress; //写地址
i2c0_Wait();
for(i=0; i<length; i++)
{
I2C0_D = u8Data; //发送数据
i2c0_Wait();
}
i2c0_Stop(); //停止命令
Pause(7); //等待
}
IIC读操作:
unsigned char I2C0ReadMultiRegisters(unsigned char SlaveAddr, unsigned char u8RegisterAddress, unsigned char bytes, char buf[])
{
unsigned char n=bytes;
int i;
/* Send Slave Address */
IIC0_StartTransmission(SlaveAddr,MWSR);
i2c0_Wait();
/* Write Register Address */
I2C0_D = u8RegisterAddress;
i2c0_Wait();
/* Do a repeated start */
I2C0_C1 |= I2C_C1_RSTA_MASK;
/* Send Slave Address */
I2C0_D = (EEPROM_I2C_ADDRESS << 1) | 0x01; //read address
i2c0_Wait();
/* Put in Rx Mode */
I2C0_C1 &= (~I2C_C1_TX_MASK);
//设置为读操作
/* Ensure TXAK bit is 0 */
I2C0_C1 &= ~I2C_C1_TXAK_MASK;
/* 虚拟读 */
result[0] = I2C0_D ; //这里的操作有什么意义?
i2c0_Wait();
for(i=0;i<n-2;i++)
{
/* Read first byte */
buf = I2C0_D;
i2c0_Wait();
}
/* 非应答*/
I2C0_C1 |= I2C_C1_TXAK_MASK;
/* Read second byte */
buf[i++] = I2C0_D; //为什么要非应答后再读次低位数据?
i2c0_Wait();
/* Send stop */
i2c0_Stop();
/* Read third byte */
buf[i++] = I2C0_D; // 为什么停止操作后再读最低位数据?
for(i = 0; i < 8; i++)
{
printf("ReadData = %d\r\n", buf); //将读取的数据通过串口发送
}
return result[0]; //这里返回值为虚拟读的值,但是我不知道如何把读到的数组buf返回,求大神指点!!!!!
}
依照惯例,其他的程序就不贴了。和上次一样,程序关注点放在红色的部分即可。
上面那个蓝色的东西,希望有大神可以不吝赐教,非常感谢。
附手册IIC读写时序:
这次实验由于读写速度很快就没有视频了,附一张图:
附源工程:
I2C_Master.zip
(1.13 MB, 下载次数: 104)
|
评分
-
查看全部评分
|