回复【11楼】 正点原子 :
---------------------------------
您好原子哥,我根据您的OLED显存显示的方案,写好了一些GUI函数,并把 模拟I2C和硬件I2C都实现(通过修改宏的值用于选择),工程跑的是RTX操作系统。这是我6月份做的智能小车,一直没什么时间现在才写了一点点的程序。希望您能看下,给些意见,谢谢。
原子哥,您的 模拟I2C实验中并不需要设置I2C引脚的方向,只要配置成开漏输出即可,开漏输出即可以做输出又可以读出引脚电平,不过 一定要接上拉电阻。
您的OLED显存二维数组个人有点不太习惯,所以改成 [8][16]形式,显存对应OLED坐标如下:
[mw_shl_code=c,true]//OLED的显存 左下角为坐标原点 即坐标为 (0,0)
//存放格式如下.
//[0]0 1 2 3 ... 127 -------------------
//[1]0 1 2 3 ... 127 | |
//[2]0 1 2 3 ... 127 | |
//[3]0 1 2 3 ... 127 | |
//[4]0 1 2 3 ... 127 | |
//[5]0 1 2 3 ... 127 | |
//[6]0 1 2 3 ... 127 |O |
//[7]0 1 2 3 ... 127 原点 --------------------
u8 OLED_GRAM[8][128];
[/mw_shl_code]
硬件I2C及模拟I2C底层函数均写好,修改宏的值及可选择,头文件代码如下:
[mw_shl_code=c,true]#ifndef _MONI_I2C_
#define _MONI_I2C_
#include <stm32f10x.h>
#define Hardware_I2C 0 //1 为硬件 I2C 0 为模拟I2C
//----------------------------------------------------------------------------------------
//I2C IO
#define I2C_NUM_RCC RCC_APB1Periph_I2C2
#define I2C_NUM I2C2
#define I2C_RCC RCC_APB2Periph_GPIOB
#define I2C_BUS GPIOB
#define IIC_SCL GPIO_Pin_10
#define IIC_SDA GPIO_Pin_11
#define I2C_SCL(x) x?GPIO_SetBits(I2C_BUS,IIC_SCL) : GPIO_ResetBits(I2C_BUS,IIC_SCL)
#define I2C_SDA(x) x?GPIO_SetBits(I2C_BUS,IIC_SDA) : GPIO_ResetBits(I2C_BUS,IIC_SDA)
#define READ_SDA GPIO_ReadInputDataBit(I2C_BUS,IIC_SDA)
#if Hardware_I2C //硬件I2C-----------------------------------------
//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(void); //IIC读取一个字节
void I2C_START(void); //开启I2C
void I2C_End(void); //关闭I2C
#else //模拟I2C----------------------------------------------------
//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读取一个字节 ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
void I2C_delay(u16 t); //I2C 延时
#define I2C_Wait 0 //I2C延时时间 用于调节I2C 速度
#endif
#endif
[/mw_shl_code]
模拟I2C只需配置成开漏输出就不需要切换引脚方向,但是一定要外接上拉电阻!
宏 I2C_Wait 用于控制模拟I2C 速度 ,值越大速度越慢
ARM智能小车跑RTX操作系统,I2C OLED 模拟I2C及硬件I2C均测试通过,OLED写好部分GUI函数。
工程文件:
|