草帽王子 发表于 2021-7-31 18:45:45

第九十九章:CH32V103应用教程——IIC-主发从收持续收发

本帖最后由 草帽王子 于 2021-7-31 18:45 编辑

前面章节介绍过硬件IIC主从之间的通信,但其需要复位一次进行一次通信。本章教程主要前面章节的基础上,进行硬件IIC之间的持续通信,无需进行复位。

1、IIC简介
关于IIC,在前面章节已经进行过介绍,在此不再赘述。
本章教程主要在第三十七章主机发送从机接收的基础上进行改进,主机发送程序与前面类似,本章主要对从机接收方法进行改进,主要使用中断接收方式。从机中断函数中具体接收流程如下:EV1—>EV2—>EV4,具体介绍如下:

[*]EV1:ADDR=1,读STAR1然后读STAR2后将清除该事件;
[*]EV2:RxNE=1,读DATAR将清除该事件;
[*]EV4:STOPF=1,读STAR1然后写CTLR1寄存器将清除该事件。


具体执行方法和步骤可见程序具体内容。
关于TIM具体介绍,可参考前面章节及CH32V103应用手册。

2、硬件设计
本章教程使用开发板硬件I2C进行主机发送从机接收实验,需用到两个开发板,将两个开发板对应IIC引脚连接起来即可。
注意:此处需要将开发板I2C引脚外接上拉电阻。

3、软件设计
本章教程主要进行硬件IIC持续收发实验,具体程序如下:
iic.h文件
#ifndef __IIC_H
#define __IIC_H

#include "ch32v10x_conf.h"

/* I2C Mode Definition */
#define HOST_MODE    0
#define SLAVE_MODE   1

/* I2C Communication Mode Selection */
//#define I2C_MODE   HOST_MODE
#define I2C_MODE   SLAVE_MODE

/* Global define */
#define Size   7
#define RXAdderss   0x02
#define TxAdderss   0x02

void IIC_Init( u32 bound, u16 address );

#endif
iic.h文件主要进行相关定义和函数声明;
iic.c文件
#include "iic.h"

extern u8 RxData;               //接收缓存
extern u8 TxData;               //发送缓存
u8 RxCount = 0x00;                  //接收计数
u8 TxCount = 0x00;                  //发送计数
u8 Rec_Finish_Flag = 0x00;            //接收完成标志
iic.c文件主要进行硬件IIC初始化以及进行IIC接收中断函数配置,关于程序讲解,可见程序注释部分。
main.c文件
/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2020/04/30
* Description      : Main program body.
*******************************************************************************/

//轮询发送、中断接收
#include "debug.h"
#include "iic.h"

/* Global Variable */

u8 TxData = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
u8 RxData;


extern __IO u8 Rec_Finish_Flag;

/*******************************************************************************
* Function Name: main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/

int main(void)

{

    u8 i=0;
    Delay_Init();

    USART_Printf_Init(115200);

    printf("SystemClk:%d\r\n",SystemCoreClock);

//当I2C作为主机时

#if (I2C_MODE == HOST_MODE)

    printf("IIC Host mode\r\n");

    //I2C进行主机初始化配置

    IIC_Init( 80000, TxAdderss);

    //while(1)

    {

    //当I2C1处于空闲状态时,跳过此while循环,开启起始信号

    while( I2C_GetFlagStatus( I2C1, I2C_FLAG_BUSY ) != RESET ); //检查是否设置了指定I2C标志


    //开启I2C1通信起始信号

    I2C_GenerateSTART( I2C1, ENABLE );


    //当最后一个事件为I2C_EVENT_MASTER_MODE_SELECT事件时,说明选择I2C作为主机模式,跳过此while循环,进行下一步

    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );//检查最后一个I2Cx事件是否等于作为参数传递的事件


    //发送地址来选择从机设备

    I2C_Send7bitAddress( I2C1, 0x02, I2C_Direction_Transmitter );


    //当最后一个事件为I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED事件时,说明选择I2C进行主机发送,跳过此while循环,进行下一步数据发送

    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );


    for( i = 0; i < 6; i++ )

    {

      /* 发送寄存器地址 */

      I2C_SendData( I2C1, TxData);

      while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );

    }


    //开启I2C通信停止信号

    I2C_GenerateSTOP( I2C1, ENABLE );

    //Delay_Ms( 1000 );

    }



    while(1);


//当I2C作为从机时

#elif (I2C_MODE == SLAVE_MODE)

    printf("IIC Slave mode\r\n");


    //I2C进行从机初始化配置

    IIC_Init( 80000, RXAdderss);


    while(1)

    {

      if(Rec_Finish_Flag)

      {

            for( i=0; i<6; i++ )

            {

               printf( "%02x\r\n", RxData );

            }

            Rec_Finish_Flag = 0;

      }

    }main.c文件主要进行函数初始化以及主机发送和打印从机数据。


4、下载验证
将编译好的程序下载到开发版并复位,主从之间无需同时供电,从机复位后,主机复位一次发送一次数据,而从机无需再次复位,从机串口打印如下:


页: [1]
查看完整版本: 第九十九章:CH32V103应用教程——IIC-主发从收持续收发