#include "lcd_iic.h"
|
|
#include "gpio.h"
|
#include "devicegpioinit.h"
|
|
void I2c_Scl_Gpio_Init(void)
|
{
|
CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
|
OutputIO(LCD_SCL_PIN_GROUP, LCD_SCL_PIN_NUM, OUT_PUSHPULL);
|
LCD_SCL_L;
|
}
|
|
void Sda_Out(void)
|
{
|
CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
|
OutputIO(LCD_SDA_PIN_GROUP, LCD_SDA_PIN_NUM, OUT_PUSHPULL);
|
}
|
|
void Sda_In(void)
|
{
|
CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
|
InputtIO(LCD_SDA_PIN_GROUP, LCD_SDA_PIN_NUM, IN_NORMAL);
|
}
|
|
void LCD_IIC_Start(void)
|
{
|
Sda_Out();
|
LCD_SDA_H;
|
LCD_SCL_H;
|
delay_us(5);
|
LCD_SDA_L; // Æô¶¯¿ªÊ¼ÐźÅ
|
delay_us(4);
|
LCD_SCL_L; // ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
|
}
|
|
void LCD_IIC_Stop(void)
|
{
|
|
Sda_Out(); // SDAÏßÊä³ö
|
LCD_SDA_L; // ·¢ËͽáÊøÌõ¼þµÄÊý¾ÝÐźÅ
|
delay_us(4);
|
LCD_SCL_H;
|
delay_us(4); // ½áÊøÌõ¼þ½¨Á¢Ê±¼ä´óÓÚ4¦Ì
|
LCD_SDA_H; // ·¢ËÍI2C×ÜÏß½áÊøÐźÅ
|
delay_us(5);
|
}
|
|
void LCD_IIC_Send_Byte(uint8_t dat)
|
{
|
// unsigned char temp;
|
// Sda_Out();
|
// for (temp = 0x80; temp != 0; temp >>= 1)
|
// {
|
// if ((temp & dat) == 0)
|
// LCD_SDA_L;
|
// else
|
// LCD_SDA_H;
|
|
// delay_us(1); /// ½¨Á¢Êý¾Ýʱ¼ä
|
// LCD_SCL_H;
|
// delay_us(4); // t_h
|
// LCD_SCL_L;
|
// delay_us(5); // t_l
|
unsigned char i;
|
Sda_Out();
|
for (i = 0; i < 8; i++)
|
{
|
if (dat & 0x80)
|
LCD_SDA_H;
|
else
|
LCD_SDA_L;
|
dat <<= 1;
|
delay_us(10);
|
LCD_SCL_H;
|
delay_us(10);
|
LCD_SCL_L;
|
}
|
delay_us(10);
|
LCD_SCL_H;
|
delay_us(10);
|
LCD_SCL_L;
|
}
|
|
uint8_t LCD_IIC_Read_Byte(void)
|
{
|
|
unsigned char temp;
|
unsigned char dat = 0;
|
LCD_SDA_H; // ÊÍ·Å×ÜÏß×¼±¸½ÓÊÕ
|
Sda_In();
|
for (temp = 0x80; temp != 0; temp >>= 1)
|
{
|
LCD_SCL_H;
|
delay_us(1);
|
if (LCD_SDA_READ == 1)
|
dat |= temp;
|
else
|
dat &= ~temp;
|
LCD_SCL_L;
|
delay_us(4);
|
}
|
|
return dat;
|
}
|
// uint8_t LCD_IIC_Read_Byte(void)/*(bool ack)*/
|
//{
|
//
|
// uint8_t byte = 0;
|
// LCD_SDA_H; // È·±£SDAΪÊäÈë
|
// for (int i = 0; i < 8; i++) {
|
// LCD_SCL_H;
|
// delay_us(1);
|
// byte <<= 1;
|
// if (LCD_SDA_READ) {
|
// byte |= 0x01;
|
// }
|
// LCD_SCL_L;
|
// delay_us(4);
|
// }
|
//// if (ack) {
|
//// LCD_IIC_Ack();
|
//// } else {
|
//// LCD_IIC_NAck();
|
//// }
|
// Sda_Out();
|
// return byte;
|
//
|
//}
|
|
char LCD_IIC_Wait_Ack(void)
|
{
|
uint32_t con = 0;
|
|
Sda_In();
|
LCD_SDA_H; // ÊÍ·ÅÊý¾ÝÏߣ¬×¼±¸½ÓÊÕÓ¦´ð
|
delay_us(1);
|
LCD_SCL_H; // CPUÇý¶¯SCL = 1, ´ËʱÆ÷¼þ»á·µ»ØACKÓ¦´ð
|
delay_us(1);
|
|
while (LCD_SDA_READ) // CPU¶ÁÈ¡SDA¿ÚÏß״̬
|
{
|
con++;
|
if (con > 500)
|
{
|
LCD_IIC_Stop();
|
return 1; // ÎÞÓ¦´ðÐźÅ
|
}
|
}
|
LCD_SCL_L;
|
delay_us(1);
|
return 0; // ÓÐÓ¦´ð
|
}
|
|
void LCD_IIC_Ack(void)
|
{
|
|
Sda_Out();
|
LCD_SDA_L;
|
delay_us(1);
|
LCD_SCL_H; // CPU²úÉú1¸öʱÖÓ
|
delay_us(4); // ʱÖÓµÍµçÆ½ÖÜÆÚ´óÓÚ4¦Ì
|
LCD_SCL_L; // ÇåʱÖÓÏߣ¬Ç¯×¡I2C×ÜÏßÒÔ±ã¼ÌÐø½ÓÊÕ
|
delay_us(4);
|
LCD_SDA_H; // CPUÊÍ·ÅSDA×ÜÏß
|
}
|
|
void LCD_IIC_NAck(void)
|
{
|
|
Sda_Out();
|
LCD_SDA_H;
|
delay_us(1);
|
LCD_SCL_H;
|
delay_us(4);
|
LCD_SCL_L;
|
delay_us(4);
|
}
|
|
/*
|
LCDд²Ù×÷£º
|
ÆðʼÐźš¢Ð´´Ó»úµØÖ·¡¢ÃüÁî×Ö½Ú¡¢É趨×Ö½Ú¡¢Í£Ö¹ÐźÅ
|
*/
|
void LCD_Write(u8 command_add, u8 *wait_data, u8 data_len)
|
{
|
u8 i = 0;
|
|
LCD_IIC_Start();
|
LCD_IIC_Send_Byte(LCD_ADDR_WRITE);
|
LCD_IIC_Send_Byte(command_add);
|
for (i = 0; i < data_len; i++)
|
LCD_IIC_Send_Byte(wait_data[i]);
|
LCD_IIC_Stop();
|
}
|
|
/*
|
ÏÔʾÊý¾ÝÊäÈëÃüÁstarts +w/r_addr+ ÃüÁî×Ö½Ú£¨0x80£©+ram¼Ä´æÆ÷µØÖ·+Êý¾ÝÄÚÈÝ......+stop ÐźÅ
|
*/
|
void LCD_Write_reg(u8 sadd, u8 *buf, u8 len)
|
{
|
u8 i = 0;
|
|
LCD_IIC_Start();
|
LCD_IIC_Send_Byte(LCD_ADDR_WRITE);
|
LCD_IIC_Send_Byte(LCD_REG_DATA_ADDR);
|
LCD_IIC_Send_Byte(sadd);
|
for (i = 0; i < len; i++)
|
{
|
LCD_IIC_Send_Byte(buf[i]);
|
}
|
LCD_IIC_Stop();
|
}
|