共2条
1/1 1 跳转至页
lpc2104,i2c lpc2104 i2c
问
sla 是E2的器件地址,suba是指写在E2里的地址,想请问一下suba_type子地址结构是什么意思?什么是时候应该用单字节?什么时候应该用双字节?什么时候用3-8+x结构?望大侠们指点,谢谢!!!!!!!!
/*
*********************************************************************************************************
** 函数名称 :I2C_WriteNByte()
** 函数功能 :向有子地址器件写入N字节数据
** 入口参数 : sla 器件从地址
** suba_type 子地址结构 1-单字节地址 3-8+X结构 2-双字节地址
** suba 器件内部物理地址
** *s 将要写入的数据的指针
** num 将要写入的数据的个数
** 出口参数 : TRUE 操作成功
** FALSE 操作失败
*********************************************************************************************************
*/
uint8 I2C_WriteNByte(uint8 sla, uint8 suba_type, uint32 suba, uint8 *s, uint32 num)
{
if (num > 0)/* 如果读取的个数为0,则返回错误 */
{ /* 设置参数 */
if (suba_type == 1)
{ /* 子地址为单字节 */
I2C_sla = sla; /* 读器件的从地址 */
I2C_suba = suba; /* 器件子地址 */
I2C_suba_num = 1; /* 器件子地址为1字节 */
}
if (suba_type == 2)
{ /* 子地址为2字节 */
I2C_sla = sla; /* 读器件的从地址 */
I2C_suba = suba; /* 器件子地址 */
I2C_suba_num = 2; /* 器件子地址为2字节 */
}
if (suba_type == 3)
{ /* 子地址结构为8+X */
I2C_sla = sla + ((suba >> 7 )& 0x0e); /* 读器件的从地址 */
I2C_suba = suba & 0x0ff; /* 器件子地址 */
I2C_suba_num = 1; /* 器件子地址为8+X */
}
I2C_buf = s; /* 数据 */
I2C_num = num; /* 数据个数 */
I2C_suba_en = 2; /* 有子地址,写操作 */
I2C_end = 0;
/* 清除STA,SI,AA标志位 */
I2CONCLR = (1 << 2)| /* AA */
(1 << 3)| /* SI */
(1 << 5); /* STA */
/* 置位STA,启动I2C总线 */
I2CONSET = (1 << 5)| /* STA */
(1 << 6); /* I2CEN*/
/* 等待I2C操作完成 */
while (I2C_end == 0)
{ }
if (I2C_end == 1)
return (TRUE);
else
return (FALSE);
}
return (FALSE);
}
答 1: suba_type 是要写进去的地址是8位或16位如果只小于256字节,8位就够了,如果大些,就要16位地址。
你要去读读i2c eeprom的手册啊。
答 2: 谢谢!!!!!!!!也就是说suba 来决定suba_type呢,当suba >256就应该用16位地址呢
/*
*********************************************************************************************************
** 函数名称 :I2C_WriteNByte()
** 函数功能 :向有子地址器件写入N字节数据
** 入口参数 : sla 器件从地址
** suba_type 子地址结构 1-单字节地址 3-8+X结构 2-双字节地址
** suba 器件内部物理地址
** *s 将要写入的数据的指针
** num 将要写入的数据的个数
** 出口参数 : TRUE 操作成功
** FALSE 操作失败
*********************************************************************************************************
*/
uint8 I2C_WriteNByte(uint8 sla, uint8 suba_type, uint32 suba, uint8 *s, uint32 num)
{
if (num > 0)/* 如果读取的个数为0,则返回错误 */
{ /* 设置参数 */
if (suba_type == 1)
{ /* 子地址为单字节 */
I2C_sla = sla; /* 读器件的从地址 */
I2C_suba = suba; /* 器件子地址 */
I2C_suba_num = 1; /* 器件子地址为1字节 */
}
if (suba_type == 2)
{ /* 子地址为2字节 */
I2C_sla = sla; /* 读器件的从地址 */
I2C_suba = suba; /* 器件子地址 */
I2C_suba_num = 2; /* 器件子地址为2字节 */
}
if (suba_type == 3)
{ /* 子地址结构为8+X */
I2C_sla = sla + ((suba >> 7 )& 0x0e); /* 读器件的从地址 */
I2C_suba = suba & 0x0ff; /* 器件子地址 */
I2C_suba_num = 1; /* 器件子地址为8+X */
}
I2C_buf = s; /* 数据 */
I2C_num = num; /* 数据个数 */
I2C_suba_en = 2; /* 有子地址,写操作 */
I2C_end = 0;
/* 清除STA,SI,AA标志位 */
I2CONCLR = (1 << 2)| /* AA */
(1 << 3)| /* SI */
(1 << 5); /* STA */
/* 置位STA,启动I2C总线 */
I2CONSET = (1 << 5)| /* STA */
(1 << 6); /* I2CEN*/
/* 等待I2C操作完成 */
while (I2C_end == 0)
{ }
if (I2C_end == 1)
return (TRUE);
else
return (FALSE);
}
return (FALSE);
}
答 1: suba_type 是要写进去的地址是8位或16位如果只小于256字节,8位就够了,如果大些,就要16位地址。
你要去读读i2c eeprom的手册啊。
答 2: 谢谢!!!!!!!!也就是说suba 来决定suba_type呢,当suba >256就应该用16位地址呢
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |