股骨径是指胎儿什么| 尿酸高吃什么食物最好| 水化是什么意思| 神经节是什么| 白子是什么东西| 依巴斯汀片是什么药| 女子胞指的是什么| 什么是蝴蝶效应| 吃什么护肝| 屁股黑是什么原因| 炖汤用什么鸡| 耳语是什么意思| 莲子适合什么人吃| 闭角型青光眼是什么意思| 黄梅时节是什么季节| 酚氨咖敏片的别名叫什么| 刘封为什么不救关羽| 酉时是什么时间| 右胸上方隐痛什么原因| 宫崎骏是什么意思| 编外人员是什么意思| 左手虎口有痣代表什么| 怀孕喝什么汤最有营养| 什么是头寸| 宝贝是什么意思| 马克笔什么牌子好| 碱是什么意思| 夏季喝什么汤好| 隔空是什么意思| 做大生化挂什么科| 权衡利弊的意思是什么| 九月十四号是什么星座| 供血不足吃什么药好| 井底之蛙是什么意思| 择期手术是什么意思| 先明后不争什么意思| 肌酸激酶偏低说明什么| 火加同念什么| 爱生气的人容易得什么病| 肝硬化有什么症状表现| 六冲是什么意思| 白羊女跟什么星座最配| 什么样的眼睛形容词| 血常规是检查什么的| 青核桃皮的功效与作用是什么| 北是什么生肖| 刮目相看是什么意思| miu是什么单位| 太阳穴痛是什么原因| 考级有什么用| 肚子咕咕叫是什么原因| 肝是起什么作用的| 蒹葭苍苍是什么意思| 勾陈是什么意思| 尿酸高可以喝什么饮料| 东南属什么五行| 荷尔蒙是什么| 乌鸦嘴是什么意思| 怀孕三个月吃什么对胎儿好| 山东简称为什么是鲁不是齐| 胶质瘤是什么病| 夏至有什么习俗| 打乒乓球有什么好处| 血小板压积偏高是什么意思| 6岁儿童为什么会长腿毛| 骨髓不造血是什么病| 学富五车是什么意思| 什么药降肌酐最有效| 气血亏虚什么症状| 扁桃体肿大吃什么药好| 胸透主要检查什么| 锁舌是什么| 血小板低是什么症状| 雅典娜是什么神| 吃藕粉对身体有什么好处| 邓超属什么生肖| 小号避孕套是什么尺寸| 干涉是什么意思| 苹果是什么季节的水果| 吃什么有助于消化| 咸鱼翻身是什么意思| 左上腹是什么器官| 大头瘟现代叫什么病| 牙疼吃什么止疼药见效快| 公务员国考和省考有什么区别| 囍是什么意思| 痛风能吃什么菜| 腺体是什么| 王火火念什么| 胃轻度肠化是什么意思| 带状疱疹可以吃什么水果| 凹儿念什么| 八月十七是什么星座| 什么是太监| 同仁是什么意思| 玩微博的都是什么人| 梦见亲嘴是什么意思| 喘息性支气管炎吃什么药| 亨廷顿舞蹈症是什么病| 胎儿停止发育是什么原因造成的| 日本艺伎是干什么的| 黑曼巴是什么意思| 用膳是什么意思| cnv是什么意思| 1963年五行属什么| 东窗事发是什么意思| 儿童吃什么长个子最快| 东施效颦的意思是什么| 大便出血吃什么药| 家里出现蛇是什么征兆| 白羊座的幸运色是什么| 肌酐高是什么引起的| 惨不忍睹是什么意思| 重庆有什么景点| 妖股是什么意思| 罗汉果泡水有什么好处| crp医学上是什么意思| 猫咪取什么名字好听| 什么是梦魇| 外阴苔藓用什么药膏| 脱脂牛奶是什么意思| 挑刺是什么意思| u型枕有什么作用| 记忆力不好吃什么| 头痛头晕吃什么药| 氯化镁是什么| 此物非彼物是什么意思| 天干指的是什么| 反酸是什么原因| 取环后吃什么恢复子宫| 刮痧是什么原理| 暂住证需要什么材料| 明年是什么年啊| 大姨妈来吃什么好| 白泽是什么| 脑供血不足吃什么药好得快| 毛肚是什么部位| 小叶增生吃什么药好| 公鸡为什么打鸣| 吃什么水果可以护肝| 场面是什么意思| 经常自言自语是什么原因| vave是什么意思| 肚子疼吃什么药最有效| 小苏打有什么作用| 舌苔发白是什么原因| 三聚净戒是指什么戒| 打喷嚏预示什么| 肝囊性灶是什么意思| hb医学上是什么意思| 牛肉炖什么好吃| 坚贞不渝是什么意思| 禄蠹是什么意思| 艾滋病早期有什么症状| 血小板低是什么原因造成的| 什么是穿堂风| 香菇配什么菜炒着好吃| 蝉什么时候出来| 一什么火箭| 淋巴滤泡增生吃什么药| 自豪的什么| 四肢麻木是什么原因引起的| 今年66岁属什么生肖的| 多囊是什么原因引起的| 做亲子鉴定需要什么东西| 什么的琥珀| 摧枯拉朽什么意思| 三七长什么样子图片| 疙瘩疤痕有什么方法可以去除| 5月21日是什么星座| 喜欢绿色的女人是什么性格| 孕妇吃什么长胎不长肉| 人为什么要生孩子| 益生菌什么时候吃最好| 减肥可以吃什么| 梦见自己骑马是什么意思| 水绿色是什么颜色| 画地为牢是什么意思| 做梦梦到小孩子是什么意思| 蟑螂吃什么东西| lee是什么档次| bitch是什么意思| 肋骨疼挂什么科| 杂菌2个加是什么意思| 臭鱼烂虾什么意思| 吃什么紧致皮肤抗衰老| 什么地方| 为什么白醋把纹身洗掉了| 淘宝预售是什么意思| 蟹黄是什么| 肠胃不好吃什么药效果好| 画肖指什么生肖| 炸酱面的酱是什么酱| 闭口长什么样子| 夏天手上长小水泡是什么原因| 大生化能查出什么病来| 琼花是什么意思| 原研药是什么意思| 杜甫世称什么| 灰面是什么面粉| 月经喝什么比较好| 蜻蜓吃什么| 白细胞一个加号什么意思| 婴儿反复发烧是什么原因引起的| 除是什么意思| 屁股大什么原因| 病毒感冒吃什么药| 企业bg是什么意思| 日逼是什么意思| vc什么意思| 福禄双全是什么意思| 烙馍卷菜搭配什么菜| 曹植字什么| 先下手为强是什么意思| soe咖啡是什么意思| 神经系统由什么组成| 什么样的马| 湿疹为什么晚上特别痒| 10月12号是什么星座| 女人脑供血不足吃什么| 什么的搏斗| 候场是什么意思| tt什么意思| 天灾人祸什么意思| 嗓子疼喝什么饮料| 子字属于五行属什么| 什么是奶昔| 五险一金有什么用| 异丙嗪又叫什么名| 火车无座是什么意思| 雍正为什么只在位13年| 九个月的宝宝吃什么辅食食谱| 什么是人彘| 人为什么有五根手指| 眼角发痒用什么眼药水| 代孕什么意思| 什么是调剂| 淡定自若什么意思| 不过是什么意思| 五倍子是什么| ki67是什么意思| 十五年是什么婚| 为什么会多囊| 什么样的人容易猝死| aids是什么意思| 惯犯是什么意思| 萎缩性胃炎吃什么药效果好| 相拥是什么意思| 事半功倍是什么意思| 氯低是什么原因| 小孩多动症是什么原因引起的| 5月30是什么星座| 胎儿胆囊偏大有什么影响| 舌头有裂痕是什么原因| 空孕囊是什么原因造成的| 开尔文是什么单位| 感冒引起的咳嗽吃什么药| 长辈生日送什么花| 疖肿是什么样子的图片| 火是什么| 头皮癣用什么药膏最好| 反复呕吐是什么病症| 空调变频和定频有什么区别| 经常喝苏打水有什么好处和坏处| 百度
打印
[RISC-V MCU 应用开发]

华益声:中日关系发展处于关键阶段

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

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

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

1、I2C简介及相关函数介绍
关于I2C,当作为主机模式使用时,在7位地址模式下,发送的第一个字节为地址字节,头7位代表的是目标从设备地址,第8位决定了后续报文的方向,0代表是主设备写入数据到从设备,1代表是主设备向从设备读取信息。
在10位地址模式下,如图所示,在发送地址阶段,第一个字节为11110xx0,xx为10位地址的最高2位,第二个字节为10位地址的低8位。若后续进入主设备发送模式,则继续发送数据;若后续准备进入主设备接收模式,则需要重新发送一个起始条件,跟随发送一个字节为11110xx1,然后进入主设备接收模式。
关于I2C相关介绍,在前面章节已经介绍,在此不再赘述。
关于CH32V103各模式介绍以及具体信息,可参考CH32V103应用手册。I2C标准库函数在第十四章节已介绍,在此不再赘述。

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

3软件设计
本章教程使用硬件I2C在10位地址模式下进行主机发送从机接收实验,其代码量相对较小,具体程序如下:
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, TxAdderss);

    //当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 );

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

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

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

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

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

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

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

    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] );
    }

#endif

    while(1);
}


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

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



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

479.49 KB

相关帖子

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

本版积分规则

133

主题

296

帖子

44

粉丝
热疹症状该用什么药膏 回头是岸是什么意思 吃什么药可以提高性功能 青云志3什么时候上映 远字五行属什么
晚上尿多吃什么药 什么饮料解渴 什么颜色的包包招财并聚财 女人打呼噜是什么原因 大便溏薄是什么意思
维生素b2有什么功效 脸上白一块一块的是什么原因 肝功能谷丙转氨酶偏高是什么原因 败火是什么意思 女人出虚汗是什么原因引起的
铁蛋白低是什么意思 柠檬是什么季节的水果 阴道什么样 gap是什么牌子的衣服 suvmax是什么意思
鱼豆腐是什么做的hcv8jop6ns9r.cn 人为什么会便秘zhongyiyatai.com 左心房扩大是什么意思hcv8jop0ns6r.cn 什么啤酒最好喝hcv7jop7ns1r.cn 蓝莓什么时候种植hcv9jop2ns0r.cn
洗银首饰用什么清洗hcv8jop9ns7r.cn 汗斑用什么药膏creativexi.com 一台什么chuanglingweilai.com 雪芽是什么茶hcv8jop0ns1r.cn 黄油可以做什么美食hcv9jop6ns9r.cn
脚浮肿是什么原因hcv9jop5ns6r.cn 公主是什么意思hcv9jop0ns0r.cn s是什么车hcv9jop6ns0r.cn 白内障是什么引起的hcv9jop0ns1r.cn 脚趾痒用什么药sanhestory.com
半夏反什么药hcv9jop1ns2r.cn 小儿感冒吃什么药hcv9jop0ns4r.cn 250什么意思inbungee.com 恳谈会是什么意思hcv8jop4ns1r.cn kid什么意思hcv9jop4ns5r.cn
百度