01. IIC简介
IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
I2C 总线在传送数据过程**有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
02. 功能描述
开机的时候先检测24C02是否存在,然后在主循环里面检测两个按键,其中 1 个按键(KEY1)用来执行写入 24C02 的操作,另外一个按键(KEY0)用来执行读出操作,在 TFTLCD 模块上显示相关信息。同时用 DS0 提示程序正在运行。
03. 硬件模块
硬件资源有:
1) 指示灯 DS0
2) KEY_UP 和 KEY1 按键
3) 串口(USMART 使用)
4) TFTLCD 模块
5) 24C02
04. 软件设计
myiic.h
- #ifndef __MYIIC_H
- #define __MYIIC_H
- #include "sys.h"
-
- //IO方向设置
- #define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;} //PB9输入模式
- #define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;} //
- //IO操作函数
- #define IIC_SCL PBout(8) //SCL
- #define IIC_SDA PBout(9) //SDA
- #define READ_SDA PBin(9) //输入SDA
- //IIC所有操作函数
- void IIC_Init(void); //初始化IIC的IO口
- void IIC_Start(void); //发送IIC开始信号
- void IIC_Stop(void); //发送IIC停止信号
- void IIC_Send_Byte(u8 txd); //IIC发送一个字节
- u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
- u8 IIC_Wait_Ack(void); //IIC等待ACK信号
- void IIC_Ack(void); //IIC发送ACK信号
- void IIC_NAck(void); //IIC不发送ACK信号
- void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
- u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
- #endif
复制代码
myiic.c
main.c
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "beep.h"
- #include "key.h"
- #include "usmart.h"
- #include "lcd.h"
- #include "rtc.h"
- #include "rng.h"
- #include "key.h"
- #include "wkup.h"
- #include "adc.h"
- #include "dma.h"
- #include "24cxx.h"
- //要写入到24c02的字符串数组
- const u8 TEXT_Buffer[]={"Explorer STM32F4 IIC TEST"};
- #define SIZE sizeof(TEXT_Buffer)
- int main(void)
- {
- u8 key;
- u16 i=0;
- u8 datatemp[SIZE];
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
- delay_init(168); //初始化延时函数
- uart_init(115200); //初始化串口波特率为115200
-
- LED_Init(); //初始化LED
- LCD_Init(); //LCD初始化
- KEY_Init(); //按键初始化
- AT24CXX_Init(); //IIC初始化
- POINT_COLOR=RED;
- LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
- LCD_ShowString(30,70,200,16,16,"IIC TEST");
- LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
- LCD_ShowString(30,110,200,16,16,"2014/5/6");
- LCD_ShowString(30,130,200,16,16,"KEY1:Write KEY0:Read"); //显示提示信息
- while(AT24CXX_Check())//检测不到24c02
- {
- LCD_ShowString(30,150,200,16,16,"24C02 Check Failed!");
- delay_ms(500);
- LCD_ShowString(30,150,200,16,16,"Please Check! ");
- delay_ms(500);
- LED1=!LED1;//DS0闪烁
- }
- LCD_ShowString(30,150,200,16,16,"24C02 Ready!");
- POINT_COLOR=BLUE;//设置字体为蓝色
- while(1)
- {
- key=Key_Scan();
- if(key==KEY1_PRESS)//KEY1按下,写入24C02
- {
- LCD_Fill(0,170,239,319,WHITE);//清除半屏
- LCD_ShowString(30,170,200,16,16,"Start Write 24C02....");
- AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);
- LCD_ShowString(30,170,200,16,16,"24C02 Write Finished!");//提示传送完成
- }
- if(key==KEY0_PRESS)//KEY0按下,读取字符串并显示
- {
- LCD_ShowString(30,170,200,16,16,"Start Read 24C02.... ");
- AT24CXX_Read(0,datatemp,SIZE);
- LCD_ShowString(30,170,200,16,16,"The Data Readed Is: ");//提示传送完成
- LCD_ShowString(30,190,200,16,16,datatemp);//显示读到的字符串
- }
- i++;
- delay_ms(10);
- if(i==20)
- {
- LED1=!LED1;//提示系统正在运行
- i=0;
- }
- }
-
- }
复制代码
|
STOP 的时序,好像不对吧