GD32 - 硬件IIC实现

一、.c文件

#include "I2c.h"


#define I2C0_SLAVE_ADDRESS7    0x82   //从机地址
#define I2C0_OWN_ADDRESS7      0x72   //自己的地址

uint8_t i2c_receiver_buf;//接收的数据




void i2c_init()
{
	/* 配置时钟 */
    rcu_config();
    /* 配置GPIO */
    gpio_config();
    /* 配置I2C */
    i2c_config();
	
		/* 发送停止信号 */
    i2c_stop_on_bus(I2C0);
    /* 等待停止信号完成 */
    while(I2C_CTL0(I2C0) & I2C_CTL0_STOP);
	
}

//接收1字节数据
uint8_t i2c_receive_byte()
{
	/* 等待I2C总线空闲 */
    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
    /* 向I2C总线发送启动信号 */
    i2c_start_on_bus(I2C0);
    /* 等待,直到设置SBSEND位 */
	while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));//设置主机发送启动条件
	
	/* 将从机地址发送到I2C总线 */
    i2c_master_addressing(I2C0, I2C0_SLAVE_ADDRESS7, I2C_RECEIVER);//设置主机接收
	/* 等待地址位被设置 */
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
    /* 清除地址位 */
    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
		
		/* 等待RBNE位设置完成 */
    while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE));
    /* 从I2C获取数据 */
    i2c_receiver_buf = i2c_data_receive(I2C0);
		
		/* 回复NACK应答信号 */
    i2c_ack_config(I2C0, I2C_ACK_DISABLE);
		
		/* 发送停止信号 */
    i2c_stop_on_bus(I2C0);
    /* 等待停止信号完成 */
    while(I2C_CTL0(I2C0) & I2C_CTL0_STOP);
}


//发送1字节数据
void i2c_send_byte(uint8_t data)
{
	/* 等待I2C总线空闲 */
    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
    /* 向I2C总线发送启动信号 */
    i2c_start_on_bus(I2C0);
    /* 等待,直到设置SBSEND位 */
	while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));//设置主机发送启动条件
	
	/* 将从机地址发送到I2C总线 */
	i2c_master_addressing(I2C0, I2C0_SLAVE_ADDRESS7, I2C_TRANSMITTER);//设置主机发送
	/* 等待地址位被设置 */
  while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
    /* 清除地址位 */
  i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
	
	//发送数据
	i2c_data_transmit(I2C0,data);
	//等待发送完成
	while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
	/* 发送停止信号 */
   i2c_stop_on_bus(I2C0);
   /* 等待停止信号完成 */
   while(I2C_CTL0(I2C0) & I2C_CTL0_STOP);
}


void rcu_config(void)
{
    /* enable GPIOB clock */
    rcu_periph_clock_enable(RCU_GPIOB);
    /* enable I2C0 clock */
    rcu_periph_clock_enable(RCU_I2C0);
}

/*!
    \brief      configure the GPIO ports
    \param[in]  none
    \param[out] none
    \retval     none
*/
void gpio_config(void)
{
    /* I2C0 GPIO ports */
    /* connect PB6 to I2C0_SCL */
    gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_6);
    /* connect PB7 to I2C0_SDA */
    gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_7);
    /* configure I2C0 GPIO */
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
}

/*!
    \brief      configure the I2C0 interface
    \param[in]  none
    \param[out] none
    \retval     none
*/
void i2c_config(void)
{
    /* configure I2C clock */
    i2c_clock_config(I2C0, 400000, I2C_DTCY_2);
    /* configure I2C address */
    i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_OWN_ADDRESS7);
    /* enable I2C0 */
    i2c_enable(I2C0);
    /* enable acknowledge */
    i2c_ack_config(I2C0, I2C_ACK_ENABLE);
}

二、.h文件

#ifndef _I2C_H
#define _I2C_H

#include "gd32e23x.h"


void i2c_init();
void rcu_config(void);
void gpio_config(void);
void i2c_config(void);
//接收1字节数据
uint8_t i2c_receive_byte();
//发送1字节数据
void i2c_send_byte(uint8_t data);

#endif

三、主函数实现

int main()
{
	unsigned char receive_buf = 0x00;//接收的数据
	i2c_init();
	i2c_send_byte(0x33)//主机发送0x33数据到从机
	receive_buf = i2c_receive_byte();//从从机获取数据
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值