刁子鱼是什么鱼| 斗鱼吃什么| 甲状腺结节是什么症状| 虫草花不能和什么一起吃| 水车是什么意思| 9.10是什么星座| 为什么脸上老长痘痘| oc是什么意思| 3月1号是什么星座| 盆腔积液是什么症状表现| 煦字五行属什么| 滑液是由什么分泌的| 送老师送什么礼物好| us是什么单位| 从胃到小腹连着疼是什么原因| 头晕目赤是什么意思| 什么是微商| 拉肚子吃什么药管用| 奸诈是什么意思| 台风什么时候到上海| 人瘦肚子大是什么原因| 喝什么利尿| 硅胶是什么材料| 胰岛素高是什么原因| 荆条是什么意思| 白带什么样子| 免疫力是什么意思| 什么东西不能托运| 神经递质是什么| 电解工是干什么的| 淋球菌阳性是什么意思| 字如其人什么意思| 血液发黑是什么原因| 什么时候刮胡子最好| 煮毛豆放什么调料| 西瓜像什么比喻句| 产物是什么意思| 欧巴桑什么意思| 居住证是什么意思| 贝五行属什么| 遂什么意思| 鬼压床是什么意思| 姓叶的男孩取什么名字好| 张靓颖什么星座| 六月初二是什么日子| 十二是什么意思| 胸疼什么原因| 成人自考本科需要什么条件| 嘴唇下面长痘痘是什么原因| 番茄什么时候种植| 记忆力下降是什么原因引起的| 肛裂涂什么药膏能愈合| 吃什么有营养| 628是什么星座| 细菌感染吃什么药| 右脚麻是什么病的前兆| 不明原因发烧挂什么科| 糖尿病吃什么水果| 相对湿度是什么意思| 十二指肠球炎是什么意思| 什么奶粉跟母乳一个味| 茂盛的意思是什么| 脾湿吃什么中成药| 胃袋是什么| 仕途是什么意思| 栋字五行属什么| 冷落是什么意思| 古代上元节是什么节日| 性冷淡是什么意思| 颅脑平扫是检查什么| 猕猴桃什么时候上市| 阳痿早泄吃什么药| 刘邦属什么生肖| 毓婷是什么药| 脱水什么意思| 登对是什么意思| 叒字什么意思| 撮箕是什么意思| 胃食管反流病是什么原因造成的| 句加一笔是什么字| 属相兔和什么属相最佳| 孕酮代表什么| 交运是什么意思| 皮肤白斑点是什么原因| 寒食节是什么时候| 为什么星星会眨眼| 两点水的字和什么有关| 佛手瓜什么时候结果| 佛龛是什么| 千人千面是什么意思| 虚岁28岁属什么生肖| 可可是什么饮料| hn是什么意思| 黄褐斑内调吃什么药| 晚上1点是什么时辰| 0.8是什么意思| 喉咙痰多是什么原因造成的| 放疗后吃什么恢复的快| 什么是桥本病| 肛门疼痛是什么原因引起的| 鎏是什么意思| 表姐的女儿叫什么| 肩袖损伤用什么药| 淘宝什么时候有活动| 1835年属什么生肖| 什么是血沉| 负离子有什么作用| 6月底什么星座| 醋泡黑豆有什么功效| 黥面是什么意思| 化干戈为玉帛是什么意思| 细菌性阴道炎用什么药效果最好| 疾苦的疾是什么意思| 炸了是什么意思| 女人吃猪肝有什么好处| 不排大便是什么原因| 生肖蛇五行属什么| 拍ct挂什么科| 霏字五行属什么| 吃了小龙虾不能吃什么| 预约转账什么时候到账| 什么情况下吃救心丸| 天天射精对身体有什么危害| 一花一世界一叶一菩提什么意思| 白皮书是什么意思| 小拇指和无名指发麻是什么原因| 梅花什么时候开花| 被臭虫咬了擦什么药| 保育员是什么| 1994年的狗是什么命| 部级是什么级别| 例假期间适合吃什么水果| 海松茸是什么东西| ket是什么意思| 药店为什么不让卖高锰酸钾| 嘴唇发紫是什么原因| 什么地走路| hcv是什么病| 蜂蜜什么人不能吃| 女同性恋叫什么| 情商低是什么意思| 芒果有什么营养| 蛰居是什么意思| 梅毒吃什么药好得快| 施食是什么意思| 双肺纹理增多增粗是什么病| 男性性功能减退吃什么药| 大脑供血不足头晕吃什么药最好| 加油站为什么不能打电话| 梅核气西医叫什么| 下场是什么意思| 尿里带血是什么原因男性| 六六无穷是什么意思| 为什么打雷| 牙疼吃什么药| 小孩流口水是什么原因| 文艺范是什么意思| 七月半吃什么| 朝朝暮暮是什么意思| 中规中矩是什么意思| 宝宝嘴巴臭臭的是什么原因| 肝火旺盛吃什么食物| bosch是什么牌子| 抓拍是什么意思| 苹果手机为什么那么贵| 甜菜碱是什么东西| 中暑是什么症状| 黑长直是什么意思| 521代表什么含义| 平菇不能和什么一起吃| 什么牌子的点读机好| 菊花的功效是什么| 双侧肾盂无分离是什么意思| 成人大便绿色是什么原因| 北齐是什么朝代| 什么人不适合做收银员| 月经可以吃什么水果| 胎儿肾积水是什么原因引起的| pca是什么意思| 脚背肿是什么原因| 下肢水肿挂什么科| 人又不人鬼不鬼是什么生肖| 什么饮料可以解酒| 血小板减少吃什么药| 胸闷憋气是什么原因| 黑咖啡为什么能减肥| 男女授受不亲是什么意思| 反酸是什么原因| 苹果a1660是什么型号| 老年人腿浮肿是什么原因引起的| 水母是什么动物| 什么是阳虚什么是阴虚| 巩加虫念什么| 吃黑米有什么好处和坏处| 张顺的绰号是什么| 胃胆汁反流是什么原因引起的| 五七年属什么生肖| 梦见去扫墓是什么预兆| 二次报销需要什么条件| 小孩满月送什么礼物好| 蚊子最怕什么植物| 什么人靠别人的脑袋生活| 张五行属什么| 安吉白茶属于什么茶| 舌苔厚是什么原因引起的| 脖子上长癣是什么原因| 开诚布公是什么意思| 阴道流黄水是什么病| 今年83岁属什么生肖| 大腿前侧是什么经络| 顺遂是什么意思| 什么可以代替狗狗沐浴露| 反应蛋白高是什么意思| 灶心土是什么| 覆水难收是什么意思| 大义是什么意思| 什么情况需要做胃镜| 什么是六合| pd是什么意思| 来月经有血块是什么原因| 黑色粑粑是什么原因| 40min是什么意思| 红馆是什么地方| 身体上有小红点是什么病| 许三多最后是什么军衔| 什么全什么美| 孩子发烧是什么原因引起的| 霜降是什么时候| 宫高是什么意思| 四面佛是什么佛| 白食是什么意思| 六月份什么星座| 重症肌无力是什么原因引起的| 长期失眠看什么科最好| 牙龈肿痛吃什么药最见效| 风对什么| 血糖高忌吃什么| 吃秋葵有什么禁忌| 石斛花有什么功效| 吃过榴莲不能吃什么| 人乳头瘤病毒是什么病| 胃火吃什么药| 生津止渴是什么意思| 骆驼是什么品牌| 止咳化痰吃什么好| 1.30是什么星座| 光脚走路有什么好处| 内分泌失调是什么| 牙结石用什么牙膏最好| 张纯如为什么自杀| 晚霞是什么意思| 下面有味道用什么药| 什么叫非萎缩性胃炎| 今年25岁属什么生肖| dn是什么| 毛豆炒什么好吃| 心影饱满是什么意思| 什么是剧烈运动| 杀青什么意思| 斗鱼吃什么食物| 神经递质是什么意思| 肠胃湿热吃什么药| 嗤之以鼻是什么意思| 副区长是什么级别| 百度
打印
[RISC-V MCU 应用开发]

365淘房手机版(手机365淘房安卓版下载)V6.4.20官方版

[复制链接]
776|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
I2c, IO, ST, pi, ni
本帖最后由 RISCVLAR 于 2021-1-5 20:30 编辑

CH32V103应用教程——I2C-10位地址模式,主机接收从机发送

本章教程主要在前面第40章的基础上进行10位地址模式下的主机接收从机发送实验。
注意,本章例程使用CH32V103硬件IIC。

1、I2C简介及相关函数介绍
关于I2C相关介绍,在前面章节已经介绍,在此不再赘述。
关于CH32V103各模式介绍以及具体信息,可参考CH32V103应用手册。I2C标准库函数在第十四章节已介绍,在此不再赘述。

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

3软件设计
本章教程在前面第40章基础上使用硬件I2C在10位地址模式下进行主机接收从机发送实验,其程序相较于第40章改动不大,具体程序如下:
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"

/*******************************************************************************
* Function Name  : IIC_Init
* Description    : Initializes the IIC peripheral.
* Input          : None
* Return         : None
*******************************************************************************/
void IIC_Init( u32 bound, u16 address )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitTSturcture;

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE );
    GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); //重映射功能,PB8和PB9重映射为I2C1
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitStructure );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitStructure );

    I2C_InitTSturcture.I2C_ClockSpeed = bound;    //设置I2C传输速率
    I2C_InitTSturcture.I2C_Mode = I2C_Mode_I2C;   //指定I2C工作模式
    I2C_InitTSturcture.I2C_DutyCycle = I2C_DutyCycle_16_9; //指定时钟占空比
    I2C_InitTSturcture.I2C_OwnAddress1 = address; //指定I2C自身设备地址
    I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable;  //使能或者关闭响应 (一般都是使能)
    I2C_InitTSturcture.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_10bit; //指定地址的长度,可以是7位或10位
    I2C_Init( I2C1, &I2C_InitTSturcture );

    I2C_Cmd( I2C1, ENABLE );

#if (I2C_MODE == HOST_MODE)
    I2C_AcknowledgeConfig( I2C1, ENABLE );

#endif
}
iic.c文件主要对开发板硬件I2C进行初始化配置,包括硬件I2C对应GPIO引脚配置以及指定I2C外设配置,其中I2C外设配置可结合ch32v10x_i2c.c文件中I2C_Init函数以及CH32V103应用手册中I2C主模式和从模式通讯步骤进行理解。
当作为主机模式时,需要将指定I2C设备地址设置为主机地址,同时需要开启I2C响应设置。当作为从机模式时,需要将指定I2C设备地址设置为从机地址。
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[Size] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
u8 RxData[Size];

/*******************************************************************************
* 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, RXAdderss);

    //当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事件是否等于作为参数传递的事件

    //在10位地址模式下,在发送地址阶段,第一个字节为11110xx0,xx为10位地址最高两位,此处值为0XF0
    I2C_Send7bitAddress( I2C1, 0xF0, I2C_Direction_Transmitter );

    //当最后一个事件为I2C_EVENT_MASTER_MODE_ADDRESS10事件时,说明在10位地址模式下选择I2C作为主机模式,跳过此while循环,进行下一步
    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_ADDRESS10 ) );

    //在10位地址模式下,发送第二个字节,为10位地址的低8位
    I2C_Send7bitAddress( I2C1, 0x02, I2C_Direction_Transmitter );

    //若后续准备进入主设备接收模式,则需要重新发送一个起始条件,跟随发送一个字节为0xF1
    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ) );   //EV6
    I2C_GenerateSTART( I2C1, ENABLE );  //重复产生起始条件

    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );
    I2C_Send7bitAddress( I2C1, 0xF1, I2C_Direction_Receiver );

    //当最后一个事件为I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED事件时,说明选择I2C进行主机接收,跳过此while循环,进行下一步数据发送
    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ) );

    while( i<6 )
    {
        //当当前标志状态为I2C_FLAG_RXNE时,进行数据接收
        if( I2C_GetFlagStatus( I2C1, I2C_FLAG_RXNE ) !=  RESET )
        {
            RxData[i] = I2C_ReceiveData( I2C1 );
            i++;
        }
    }

    printf( "RxData:\r\n" );
    for( i=0; i<6; i++ )
    {
        printf( "%02x\r\n", RxData[i] );
    }

    //当最后一个事件为I2C_EVENT_MASTER_BYTE_RECEIVED事件时,说明接收结束,跳过此while循环,进行下一步
    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED ) );

    //开启I2C通信停止信号
    I2C_GenerateSTOP( I2C1, ENABLE );

//当I2C作为从机时
#elif (I2C_MODE == SLAVE_MODE)
    printf("IIC Slave mode\r\n");

    //I2C进行从机初始化配置
    IIC_Init( 80000, TxAdderss);

    //当最后一个事件为I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED事件时,说明选择I2C作为从机进行数据发送,跳过此while循环,进行数据发送
    while( !I2C_CheckEvent( I2C1, I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ) );

    while( i<6 )
    {
        //当当前标志状态为I2C_FLAG_TXE时,进行数据发送
        if( I2C_GetFlagStatus( I2C1, I2C_FLAG_TXE ) !=  RESET )
        {
            I2C_SendData( I2C1, TxData[i] );
            printf("T=%d\n",TxData[i]);
            i++;
        }
    }

#endif

    while(1);
}

main.c文件主要进行主机模式下的数据接收配置和从机模式下的数据发送配置。其中在10位地址模式下,如图所示,在发送地址阶段,第一个字节为11110xx0,xx为10位地址的最高2位,第二个字节为10位地址的低8位。若后续进入主设备发送模式,则继续发送数据;若后续准备进入主设备接收模式,则需要重新发送一个起始条件,跟随发送一个字节为11110xx1,然后进入主设备接收模式。

4下载验证
将编译好的程序分别在主机模式和从机模式下下载到两个开发版,并将两个开发板的PB8和PB9引脚接上拉电阻然后连接起来,将两个开发板进行复位,即可进行I2C通信,主机接收开发板串口打印情况具体如下:


40、IIC-10位地址模式,主机接收从机发送.rar

483.34 KB

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

296

帖子

44

粉丝
开心果树长什么样 周杰伦为什么喜欢昆凌 烤鱼一般用什么鱼 更年期出虚汗吃什么药 宁字五行属什么的
晨尿茶色是什么原因 静脉曲张溃烂擦什么药 浑圆是什么意思 乡试第一名叫什么 cps是什么单位
itp是什么 xxx是什么意思 百合花什么时候开花 为什么左手会发麻 什么是御姐
毕业是什么意思 五花肉炖什么好吃 岁月静好浅笑安然什么意思 现在是什么时辰 梦见水果是什么意思
牵牛花为什么叫牵牛花hcv8jop5ns3r.cn 药师佛手里拿什么法器hcv8jop5ns3r.cn pussy是什么意思hcv8jop4ns0r.cn 高压低是什么原因hcv9jop5ns5r.cn 天明是什么意思hcv8jop4ns0r.cn
睾丸疼痛什么原因hcv9jop0ns6r.cn 泡泡纱是什么面料hcv7jop9ns2r.cn 猪展是什么yanzhenzixun.com 人乳头瘤病毒感染是什么意思hcv8jop6ns7r.cn 卯木代表什么hcv9jop0ns7r.cn
泰国有什么好玩hcv8jop2ns5r.cn 自变量是什么imcecn.com 地塞米松是什么药hcv8jop6ns0r.cn 饮食男女是什么意思hcv9jop5ns3r.cn 感冒去医院挂什么科hcv9jop3ns4r.cn
1927年中国发生了什么jasonfriends.com 1924年属什么hcv8jop8ns1r.cn 什么是夹角hcv8jop2ns3r.cn 喝葡萄糖有什么功效与作用hcv8jop5ns1r.cn 中风吃什么药最有效hcv8jop4ns1r.cn
百度