#include "i2c.h"
#include "systick.h"
#include <stdio.h>
/************************************************
函数名称 : I2C_GPIO_Configuration
功 能 : I2C引脚配置(推挽输出)
参 数 : 无
返 回 值 : 无
作 者 :
*************************************************/
/************************************************
函数名称 : dri_i2c_simulate_init
功 能 : I2C初始化
参 数 : 无
返 回 值 : 无
作 者 :
*************************************************/
void i2c_init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOC);
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_9);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
gpio_bit_set(GPIOA,GPIO_PIN_8);
gpio_bit_set(GPIOC,GPIO_PIN_9);
}
/************************************************
函数名称 : I2C_SDA_SetOutput
功 能 : I2C_SDA设置为输出
参 数 : 无
返 回 值 : 无
作 者 :
*************************************************/
void i2c_sda_out(void)
{
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_9);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
}
/************************************************
函数名称 : I2C_SDA_SetInput
功 能 : I2C_SDA设置为输入
参 数 : 无
返 回 值 : 无
作 者 :
*************************************************/
void i2c_sda_in(void)
{
gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_9);
}
/************************************************
函数名称 : I2C_Start
功 能 : I2C开始
* SCL: __________
* \__________
* SDA: _____
* \_______________
参 数 : 无
返 回 值 : 无
作 者 :
*************************************************/
void i2c_start(void)
{
i2c_sda_out();
I2C_SCL_HIGH; //SCL高
delay_1us(5);
I2C_SDA_HIGH; //SDA高 -> 低
delay_1us(5);
I2C_SDA_LOW; //SDA低
delay_1us(5);
I2C_SCL_LOW; //SCL低(待写地址/数据)
delay_1us(5);
}
/************************************************
函数名称 : dri_i2c_stop
功 能 : I2C停止
* SCL: ____________________
* __________
* SDA: _________/
参 数 : 无
返 回 值 : 无
作 者 :
*************************************************/
void i2c_stop(void)
{
i2c_sda_out();
I2C_SCL_LOW; //SCL低 -> 高
delay_1us(5);
I2C_SDA_LOW; //SDA低 -> 高
delay_1us(5);
I2C_SCL_HIGH; //SCL高
delay_1us(5);
I2C_SDA_HIGH; //SDA高
delay_1us(5);
}
/************************************************
函数名称 : I2C_PutAck
功 能 : I2C主机产生应答(或非应答)位
参 数 : Ack:
I2C_ACK ----- 0: 应答
I2C_NOACK --- 1:非应答
注意从机的应答电平
返 回 值 : 无
作 者 :
*************************************************/
uint8_t i2c_wait_ack(void)
{
uint8_t errTimer = 0;
i2c_sda_in();
I2C_SDA_HIGH;
delay_1us(1);
I2C_SCL_HIGH;
delay_1us(1);
while(I2C_SDA_READ){
errTimer++;
if(errTimer>250)
{
i2c_stop();
return 1;
}
}
I2C_SCL_LOW; //SCL低
delay_1us(1);
return 0;
}
//产生ACK应答
void IIC_Ack(void)
{
I2C_SCL_LOW;
i2c_sda_out();
I2C_SDA_LOW;
delay_1us(2);
I2C_SCL_HIGH;
delay_1us(2);
I2C_SCL_LOW;
}
//不产生ACK应答
void IIC_NAck(void)
{
I2C_SCL_LOW;
i2c_sda_out();
I2C_SDA_HIGH;
delay_1us(2);
I2C_SCL_HIGH;
delay_1us(2);
I2C_SCL_LOW;
}
/************************************************
函数名称 : I2C_WriteByte
功 能 : I2C写一字节
参 数 : Data -------- 数据
返 回 值 : I2C_ACK ----- 应答
I2C_NOACK --- 非应答
作 者 :
*************************************************/
void i2c_write_byte(uint8_t Data)//0xA0
{
uint8_t cnt;
i2c_sda_out();
I2C_SCL_LOW; //拉低时钟 开始传输数据
delay_1us(1);
for(cnt = 0; cnt < 8; cnt++) {
if((Data & 0x80) >> 7) {
I2C_SDA_HIGH;
}else{
I2C_SDA_LOW;
}
Data<<=1;
delay_1us(2);
I2C_SCL_HIGH;
delay_1us(2);
I2C_SCL_LOW;
delay_1us(2);
}
}
/************************************************
函数名称 : I2C_ReadByte
功 能 : I2C读一字节
参 数 : ack --------- 产生应答(或者非应答)位
返 回 值 : data -------- 读取的一字节数据
作 者 :
*************************************************/
uint8_t i2c_read_byte(uint8_t ack)
{
uint8_t cnt;
uint8_t data;
i2c_sda_in(); //SDA配置为输入模式
for(cnt=0;cnt<8;cnt++ ) {
I2C_SCL_LOW;
delay_1us(2);
I2C_SCL_HIGH;
data<<=1;
if(I2C_SDA_READ){
data++;
}
delay_1us(1);
}
if (!ack) {
IIC_NAck(); //发送nACK
}
else{
IIC_Ack(); //发送ACK
}
return data; //返回数据
}
uint8_t BL24C256_ReadOneByte(uint16_t ReadAddr)
{
uint8_t temp=0;
i2c_start();
i2c_write_byte(0xA0); //发送写命令
i2c_wait_ack();
i2c_write_byte((ReadAddr>>8)&0xff);//发送高地址
i2c_wait_ack();
i2c_write_byte(ReadAddr&0xff); //发送低地址
i2c_wait_ack();
i2c_start();
i2c_write_byte(0xA1);//进入接收模式
i2c_wait_ack();
temp=i2c_read_byte(0);
i2c_stop();//产生一个停止条件
return temp;
}
void BL24C256_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite)
{
i2c_start();
i2c_write_byte(0xA0);//发送设备地址
i2c_wait_ack();
i2c_write_byte((WriteAddr>>8)&0xff);//发送字节地址
i2c_wait_ack();
i2c_write_byte(WriteAddr&0xff); //发送要写入的数据
i2c_wait_ack();
i2c_write_byte(DataToWrite); //发送要写入的数据
i2c_wait_ack();
i2c_stop();//产生一个停止条件
delay_1ms(10);
}
void BL24C256_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
{
while(NumToRead)
{
*pBuffer++=BL24C256_ReadOneByte(ReadAddr++);
NumToRead--;
}
}
void BL24C256_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)
{
while(NumToWrite--)
{
BL24C256_WriteOneByte(WriteAddr,*pBuffer);
WriteAddr++;
pBuffer++;
}
}
void i2c_test(void)
{
uint8_t i;
uint8_t buf[128]={0},buf2[128]={0};
for(i=0; i< 128; i++) {
buf2[i] = 1;
}
BL24C256_Write(0x0000,buf2, 128);
delay_1ms(5);
BL24C256_Read(0x0000,buf,128);
}
/**** END OF FILE ****/
嘻嘻爱编码
- 粉丝: 1005
- 资源: 241
最新资源
- 图像识别实战项目-基于深度学习与多种应用领域的图像处理与分析
- golin 扫描工具使用, 检查系统漏洞、web程序漏洞
- 多种编程语言下的算法实现资源及其应用场景
- BGM坏了吗111111
- 高等工程数学试题详解:矩阵分析与最优化方法
- 这是一个以20位中国著名书法家的风格编写的汉字作品的数据集 每个子集中有1000-7000张jpg图像(平均5251张图像)
- 【Academic tailor】学术小裁缝必备知识点:全局注意力机制(GAM)pytorch
- 数据科学领域的主流数据集类型及其应用分析
- 【Academic tailor】学术小裁缝必备知识点:全局注意力机制(GAM)TensorFlow
- Apple MacBook Pro和macOS Monterey用户的全方位使用指南
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈