查看: 1194|回复: 0
收起左侧

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

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-7-31 18:45:45 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 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文件
    1. #ifndef __IIC_H
    2. #define __IIC_H

    3. #include "ch32v10x_conf.h"

    4. /* I2C Mode Definition */
    5. #define HOST_MODE    0
    6. #define SLAVE_MODE   1

    7. /* I2C Communication Mode Selection */
    8. //#define I2C_MODE   HOST_MODE
    9. #define I2C_MODE   SLAVE_MODE

    10. /* Global define */
    11. #define Size   7
    12. #define RXAdderss   0x02
    13. #define TxAdderss   0x02

    14. void IIC_Init( u32 bound, u16 address );

    15. #endif
    复制代码

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

    2. extern u8 RxData[Size];               //接收缓存
    3. extern u8 TxData[Size];               //发送缓存
    4. u8 RxCount = 0x00;                    //接收计数
    5. u8 TxCount = 0x00;                    //发送计数
    6. u8 Rec_Finish_Flag = 0x00;            //接收完成标志
    复制代码

    iic.c文件主要进行硬件IIC初始化以及进行IIC接收中断函数配置,关于程序讲解,可见程序注释部分。
    main.c文件
    1. /********************************** (C) COPYRIGHT *******************************
    2. * File Name          : main.c
    3. * Author             : WCH
    4. * Version            : V1.0.0
    5. * Date               : 2020/04/30
    6. * Description        : Main program body.
    7. *******************************************************************************/

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

    11. /* Global Variable */

    12. u8 TxData[Size] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
    13. u8 RxData[Size];


    14. extern __IO u8 Rec_Finish_Flag;

    15. /*******************************************************************************
    16. * Function Name  : main
    17. * Description    : Main program.
    18. * Input          : None
    19. * Return         : None
    20. *******************************************************************************/

    21. int main(void)

    22. {

    23.     u8 i=0;
    24.     Delay_Init();

    25.     USART_Printf_Init(115200);

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

    27. //当I2C作为主机时

    28. #if (I2C_MODE == HOST_MODE)

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

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

    31.     IIC_Init( 80000, TxAdderss);

    32.     //while(1)

    33.     {

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

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


    36.     //开启I2C1通信起始信号

    37.     I2C_GenerateSTART( I2C1, ENABLE );


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

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


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

    41.     I2C_Send7bitAddress( I2C1, 0x02, I2C_Direction_Transmitter );


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

    43.     while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );


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

    45.     {

    46.         /* 发送寄存器地址 */

    47.         I2C_SendData( I2C1, TxData[i]  );

    48.         while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );

    49.     }


    50.     //开启I2C通信停止信号

    51.     I2C_GenerateSTOP( I2C1, ENABLE );

    52.     //Delay_Ms( 1000 );

    53.     }



    54.     while(1);


    55. //当I2C作为从机时

    56. #elif (I2C_MODE == SLAVE_MODE)

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


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

    59.     IIC_Init( 80000, RXAdderss);


    60.     while(1)

    61.     {

    62.         if(Rec_Finish_Flag)

    63.         {

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

    65.             {

    66.                printf( "%02x\r\n", RxData[i] );

    67.             }

    68.             Rec_Finish_Flag = 0;

    69.         }

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


    4、下载验证
    将编译好的程序下载到开发版并复位,主从之间无需同时供电,从机复位后,主机复位一次发送一次数据,而从机无需再次复位,从机串口打印如下:
    CH32V CH573单片机芯片-第九十九章:CH32V103应用教程——IIC-主发从收持续收发risc-v单片机中文社区(1)
    CH32V CH573单片机芯片-第九十九章:CH32V103应用教程——IIC-主发从收持续收发risc-v单片机中文社区(2) 98、IIC-主发从收持续收发.rar (483.32 KB, 下载次数: 14)





    上一篇:第九十八章:CH32V103应用教程——RTC-脉冲
    下一篇:第一百章:CH32V103应用教程——红外测距
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-11-26 09:45 , Processed in 0.354972 second(s), 47 queries .

    快速回复 返回顶部 返回列表