在线时间21 小时
UID3113538
注册时间2021-8-25
NXP金币0
该用户从未签到
注册会员
- 积分
- 164
- 最后登录
- 2021-10-7
|
楼主 |
发表于 2021-9-20 13:38:19
|
显示全部楼层
本帖最后由 功夫崽崽 于 2021-9-20 13:52 编辑
1,结合“ 小恩GG” 的帮助,找到PB7 没有输出的原因,初始化内部晶振时 ICS->C1 = 0x02; 选择了外部晶振参考 改成0x06, PB7 可以输出了;
2,PB7 可以输出后 数据有不正确的(最初参看这个贴子 https://www.nxpic.org.cn/module/ ... 54911&highlight=i2c );
3,连续写第二次的时候写失败,应该是逻辑上设置错误,参照官方demo 修改为以下代码,测试通过;
3-1:写函数
uint8_t mI2C_MasterWriteBuffer_24C08(I2C_Type *pI2Cx,uint16_t u16SlaveAddress,uint8_t *pWrBuff,uint16_t u16Length)
{
uint16_t i;
mI2C_Start(pI2Cx);
i = u16SlaveAddress >> 8;
i <<= 1;
mI2C_Wait_TC(pI2Cx);
pI2Cx->C1 |= 0x10; //I2C_TxEnable(pI2Cx);
pI2Cx->D = (0xA0 | i);
mI2C_Wait(pI2Cx); //0x02
mI2C_WaitAck(pI2Cx); //
mI2C_Wait_TC(pI2Cx);
pI2Cx->D = (u16SlaveAddress % 256);
mI2C_Wait(pI2Cx);
mI2C_WaitAck(pI2Cx);
while(u16Length--)
{
mI2C_Wait_TC(pI2Cx);
pI2Cx->D = (* pWrBuff);
mI2C_Wait(pI2Cx);
mI2C_WaitAck(pI2Cx);
pWrBuff++;
}
mI2C_Stop(pI2Cx);
I2C_Delay_nop(100);
return 0x00;
}
3-2:读函数
uint8_t mI2C_MasterReadBuffer_24C08(I2C_Type *pI2Cx,uint16_t u16SlaveAddress,uint8_t *pRdBuff,uint16_t u16Length)
{
uint8_t dummyRead;
uint16_t i;
mI2C_Start(pI2Cx);
i = u16SlaveAddress >> 8;
i <<= 1;
mI2C_Wait_TC(pI2Cx);
pI2Cx->C1 |= 0x10; //I2C_TxEnable(pI2Cx);
pI2Cx->D = (0xA0 | i);
mI2C_Wait(pI2Cx);
mI2C_WaitAck(pI2Cx);
mI2C_Wait_TC(pI2Cx);
pI2Cx->D = (u16SlaveAddress % 256);
mI2C_Wait(pI2Cx);
mI2C_WaitAck(pI2Cx);
mI2C_Wait_TC(pI2Cx);
mI2C_ReStart(pI2Cx);
pI2Cx->D = (0xA1 | i);
mI2C_Wait(pI2Cx);
mI2C_WaitAck(pI2Cx);
mI2C_Wait_TC(pI2Cx);
pI2Cx->C1 &= ~0x10; //I2C_RxEnable(pI2Cx);
mI2C_SendAck(pI2Cx); //TXAK=1
dummyRead = pI2Cx->D; //空读,启动接收
mI2C_Wait(pI2Cx);
while(u16Length)
{
mI2C_Wait_TC(pI2Cx);
// *pRdBuff = pI2Cx->D;
// mI2C_Wait(pI2Cx);
if(u16Length == 1)
{
mI2C_SendNack(pI2Cx);
//mI2C_Stop(pI2Cx); //读取最后一个字节先发stop
}else
{
mI2C_SendAck(pI2Cx);
}
*pRdBuff = pI2Cx->D;
mI2C_Wait(pI2Cx);
pRdBuff++;
u16Length--;
}
//mI2C_SendNack(pI2Cx);
mI2C_Stop(pI2Cx);
I2C_Delay_nop(100);
return dummyRead;
}
//
void AT24C08_WriteData(uint8_t *p,uint16_t addr,uint16_t len)
{
uint16_t i;
if((len > 1024) || ((len % 16) != 0) || (addr > 0x0400))
{
return;
}
for(i=0;i<len;i+=16)
{
mI2C_MasterWriteBuffer_24C08(I2C0,addr,&p,16);
}
}
void AT24C08_ReadData(uint8_t *p,uint16_t addr,uint16_t len)
{
uint16_t i;
if((len > 1024) || ((len % 16) != 0) || (addr > 0x0400))
{
return;
}
for(i=0;i<len;i+=16)
{
mI2C_MasterReadBuffer_24C08(I2C0,addr,&p,16);
}
}
4:测试,连续写1024个字节的 AA,再读出来,入下图;
|
-
|