LPC1788之IIC协议(包含片内集成和GPIO两种)
时间:10-02
整理:3721RD
点击:
前一段时间,因为要用到一个屏幕,是IIC协议的,所以,对IIC协议进行了一定的研究,特此把它记录下来,方便以后的查看。
本次主要使用了LPC1788的来和GT910进行IIC通讯,因为LPC1788内部集成支持IIC总线,开始的时候,我使用的是GPIO模拟IIC,这样方便了解IIC。
具体如下:
GPIO模式下,配置引脚SCL,SDA引脚输入输出方式。
本次主要使用了LPC1788的来和GT910进行IIC通讯,因为LPC1788内部集成支持IIC总线,开始的时候,我使用的是GPIO模拟IIC,这样方便了解IIC。
具体如下:
GPIO模式下,配置引脚SCL,SDA引脚输入输出方式。
- static 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;
- }
- 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 );
- }
谢谢分享,学习了