NXP MCU 技术论坛
登录
直播中
杨永胜
12年用户
2379经验值
擅长:嵌入式技术
私信
关注
[讨论]
LPC1788之IIC协议(包含片内集成和GPIO两种)
LPC1788
前一段时间,因为要用到一个屏幕,是IIC协议的,所以,对IIC协议进行了一定的研究,特此把它记录下来,方便以后的查看。
本次主要使用了LPC1788的来和GT910进行IIC通讯,因为LPC1788内部集成支持IIC总线,开始的时候,我使用的是GPIO模拟IIC,这样方便了解IIC。
具体如下:
GPIO模式下,配置引脚SCL,SDA引脚输入输出方式。
sta
ti
c void iic_scl_out(void)//P0.20
{
GPIO_SetDir(0,1<<20,1);//配置输出方式
}
static void iic_sda_out(void)//P0.19
{
GPIO_SetDir(0,1<<19,1);//配置输出方式
}
static void iic_sda_in(void)//P0.19
{
GPIO_SetDir(0,1<<19,0);//配置成输入方式,为了获取应答。
}
主机模式下,发送起始信号:
extern void bsp_starti2c (void)//在SCL是高电平时,SDA产生下降沿
{
iic_sda_out();
SDA_H();
SCL_H();
IIC_delay( IIC_Delay_COUNT );
SDA_L();
IIC_delay( IIC_Delay_COUNT );
SCL_L();
IIC_delay( IIC_Delay_COUNT );
}
主机模式下发送数据,并设置是否需要应答
extern uint32_t bsp_sendi2c (uint8_t dat, Bool ack)//ack是是否应答位
{
uint32_t i;
iic_sda_out();
for (i = 0; i < 8; i++)
{
SCL_L();
IIC_delay( IIC_Delay_COUNT );
if (dat & 0x80)//SCL低电平时,SDA引脚电平变化。
{
SDA_H();
}
else
{
SDA_L();
}
IIC_delay( IIC_Delay_COUNT );
dat <<= 1;
SCL_H();//SCL置高电平,完成SDA数据发送。
IIC_delay( IIC_Delay_COUNT );
SCL_L();
}
if (ack)//判断是否需要等待应答,如果是要发送的最后一byte数据,则可以不需要等待应答。
{
iic_wait_ack();
return 0;
}
else
{
return 1;
}
}
等待应答函数:
static void iic_wait_ack(void)
{
unsigned int ys;
SCL_L();
IIC_delay( IIC_Delay_COUNT );
SDA_H();//SDA置高电平
IIC_delay( IIC_Delay_COUNT );
SCL_H();
iic_sda_in(); //开始准备接收应答位,如果SDA被拉低,说明应答,否则没有应答。
IIC_delay( IIC_Delay_COUNT );
do
{ys = GPIO_ReadValue (0);
ys >>= 19;
ys &= 0x01;}
while(ys);//如果SDA一直是高电平, 说明没有应答。
SCL_L();
}
读取数据
extern uint32_t bsp_readi2c (uint8_t *retdat, Bool ack)//判断是否应答,如果是要接受的最后一字节数据,则不发送应答信号,否则要发送应答信号。
{
uint8_t temp;
uint32_t i;
uint32_t ys;
SDA_H();
SCL_L();//SCL拉低,允许SDA数据发生变化。
IIC_delay( IIC_Delay_COUNT );
iic_sda_in(); //设置输入模式,准备读取引脚电平
for (i = 0; i < 8; i++)
{
temp <<= 1; 先读取最高位
SCL_H();
iic_sda_in();
IIC_delay( IIC_Delay_COUNT );
ys = GPIO_ReadValue (0);
ys >>= 19;
ys &= 0x01;
if (ys)
{
temp |= 0x01;
}
else
{
temp &= ~(0x01);
}
SCL_L();
IIC_delay( IIC_Delay_COUNT );
}
*retdat = temp;
if (ack == TRUE)
{
iic_ack();//发送应答信号
}
else
{
iic_nack();//发送非应答信号
}
return 0;
}
发送iicstop信号
extern void bsp_stopi2c (void)
{
SCL_L();
IIC_delay( IIC_Delay_COUNT );//延时函数
SDA_L();
IIC_delay( IIC_Delay_COUNT );
SCL_H();//SCL置高电平
IIC_delay( IIC_Delay_COUNT );
SDA_H();//SDA产生上升沿,就是停止信号
IIC_delay( IIC_Delay_COUNT );
}
回帖
(1)
kjfd
2015-11-9 10:51:14
谢谢分享,学习了
谢谢分享,学习了
举报
更多回帖
rotate(-90deg);
回复
相关帖子
LPC1788
LPC1788
之
片
内
集成
IIC
协议
。
3451
基于
LPC1788
的高端称重系统
4
LPC1788
资料
1333
LPC1788
1811
LPC1788
驱动SDRAM的问题
9194
LPC1788
lwip移植问题
1389
emWin在
LPC1788
上的移植与应用
14
分享NXP
LPC1788
开发板
之
网络例程应用
7945
在
LPC1788
上实现emWin的多缓冲功能
0
在
LPC1788
上实现emWin的多缓冲功能
0
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分