后背疼是什么原因引起的| 颓废是什么意思| 胃胀想吐是什么原因| 揉肚子有什么好处| 蛇吃什么东西| 鱼的尾巴有什么作用| 水木年华是什么意思| 什么样的房子不能住人脑筋急转弯| 缺少雌激素吃什么可以补充| 乾隆是什么朝代| 四月十六日是什么星座| 孕妇拉肚子可以吃什么药| 一个虫一个夫念什么| 指甲紫色是什么病的征兆| eblan是什么品牌| 左肩后背疼是什么原因| 脚腿肿是什么原因引起的| 丹毒是什么原因引起的| 人体缺硒会有什么症状| 飞吻是什么意思| 打坐有什么好处| 有痰是什么原因| 弱精吃什么能提高活力| air是什么意思| 原字五行属什么| 什么喷剂延时最好| 锁骨疼挂什么科| hgh是什么意思| 牛筋草用什么除草剂| 头发拉焦了有什么补救| 吃恩替卡韦有什么副作用| 梦见生了个女儿是什么意思| 查凝血酶能查出什么病| 心脏搭桥后最怕什么| 五心烦热吃什么药最快| 社保缴纳基数是什么意思| 脆生生的什么| abc是什么药| 鼻尖发红是什么原因| 陈光标做什么生意| 安全起见是什么意思| 婧五行属什么| 蛋疼是什么原因引起的| 八字带什么的长寿| 使节是什么意思| 骨折吃什么补品| 螺旋幽门杆菌吃什么药治疗好| 端午节是什么星座| 小朋友膝盖疼是什么原因| 肛周湿疹用什么药膏效果好| 川崎病是什么| 剁椒是什么辣椒| 缺钾最明显的症状是什么| 亲额头代表什么意思| 关节间隙变窄什么意思| 5月21日是什么星座| 独角戏什么意思| 梦见订婚是什么意思| 眼睛双重影什么原因| 6.25是什么日子| 核糖体是什么| 胸膜炎是什么症状| mice是什么意思| 刘姥姥进大观园什么意思| 什么是穿堂风| 三伏吃什么| 妇科炎症小腹坠痛吃什么药| 宝宝半夜咳嗽是什么原因| 脑干堵塞什么症状| 支那人什么意思| 地藏菩萨求什么最灵| 牛黄安宫丸治什么病| 宫腔镜检查主要查什么| 什么望外| 儿童手指头脱皮什么原因引起的| 无异于是什么意思| 开路是什么意思| 氯化钾是什么东西| 25属什么生肖| hr医学上什么意思| 感冒为什么会流鼻涕| 0x00000024蓝屏代码是什么意思| chocker是什么| 目赤什么意思| mds是什么病的简称| 白带黄用什么药| 胸部什么时候停止发育| 感冒头疼是什么原因| dr检查是什么| 来大姨妈肚子疼是什么原因| 肾钙化灶是什么意思| 1970年五行属什么| 食指发麻是什么原因| 手掌脱皮是什么原因| 月经期间喝酒会有什么影响| 暗财是什么意思| 性生活后尿路感染是什么原因| 支行行长什么级别| 任督二脉是什么意思| 悲戚是什么意思| 抗糖是什么意思| 10月5号什么星座| 有什么功效| 一九六七年属什么生肖| 冷血动物是什么意思| 此言念什么| 什么的腊梅| 什么是月子病| 眼睛上火用什么眼药水| 88年的属什么生肖| 脚气用什么| puma是什么品牌| 体内湿气太重吃什么药能快速除湿| 尿多是什么问题| 均金念什么| 乌龟浮水是什么原因| 什么叫扁平疣长什么样| 痔瘘和痔疮有什么区别| 岁月蹉跎是什么意思| 肾阴虚吃什么中成药| 英雄难过美人关是什么意思| 10万个为什么| 5.4是什么星座| 变化不著是什么意思| 李思思为什么离开央视| 字母哥什么位置| 腌鱼放什么调料| 软冷冻室一般放什么东西| soho是什么意思| 厌氧菌是什么意思| 什么人容易得天疱疮| 深度睡眠是什么意思| 疣是什么病毒| 颈椎痛挂什么科| 什么样的雪花| 狗狗吃胡萝卜有什么好处| 紫癜是什么原因引起的| 开宠物医院需要什么条件| 便秘喝什么茶最快排便| hrd是什么| 住房公积金缴存基数是什么意思| 玫瑰糠疹吃什么药最有效| 五一广场有什么好玩的| 虎父无犬子什么意思| diff是什么意思| 七岁属什么生肖| 龟头感染用什么药| 脾主什么| 梦见牙齿掉光了是什么征兆| 今年65岁属什么生肖| 铲子是什么意思| 中元节又叫什么节| 潜血弱阳性什么意思| 国代是什么意思| 酒精过敏是什么症状| 钩藤为什么要后下| 动物都有什么| 淋巴结是什么原因引起的| 糖化血红蛋白高是什么意思| 下肢静脉曲张是什么原因引起的| 什么的烤鸭| 头部容易出汗是什么原因| 甲钴胺片是治什么的| 蛋花样大便是什么原因| 京五行属什么| 胎儿永存左上腔静脉是什么意思| 去医院看舌头挂什么科| 什么原因会导致月经推迟| 为什么吃辣的就拉肚子| 血糖高吃什么水果好| 灵芝适合什么样的人吃| 阻生齿是什么意思| 早搏是什么感觉| 为什么会长针眼| 六月二十四是什么日子| 说话口臭是什么原因引起的| 吃芒果不能吃什么| cj是什么| 夜长梦多是什么意思| 十二生肖它第一是什么生肖| 过期牛奶可以做什么| 利空什么意思| 中暑吃什么水果| 前列腺炎忌口什么食物| 甩货是什么意思| 胃疼吃什么药最有效| 作是什么意思| 吃什么有助于伤口愈合| 成都什么地方好玩| 卒中是什么意思| 电磁炉用什么锅最好| 租赁费计入什么科目| 门神是什么意思| 是什么| 甲状腺看什么科| 店长的工作职责是什么| 舒筋健腰丸为什么这么贵| 什么含维生素d| 国防部是干什么的| 红斑狼疮什么症状| cd8高是什么原因| 肠粉是用什么材料做的| o型血父母是什么血型| 外阴瘙痒是什么情况| 10mg是什么意思| 做小吃什么生意最赚钱| 九八年属什么生肖| 抗sm抗体阳性什么意思| 印度什么人种| 喉咙干咳嗽是什么原因| 郭敬明为什么叫小四| 经常流鼻血是什么病的前兆| 卵巢囊肿是什么引起的| 香港的别称是什么| 什么歌最好听| PSV是什么意思| 香蕉与什么食物相克| 草莓是什么形状| 囧是什么意思| 女兔配什么属相最好| 尿是褐色的是什么原因| 晚上总是做梦是什么原因引起的| 混合痔是什么| 铁是什么颜色| 阑尾炎挂什么科室| 10月17是什么星座| 淑女气质给人什么感觉| 心脏逆钟向转位是什么意思| 侍中是什么官| 什么是配速| 肚脐眼周围痛挂什么科| 脉搏弱是什么原因| 缺失是什么意思| 什么是闰年什么是平年| 肝瘘是什么| 氟利昂是什么| 男性b超检查什么项目| 爱叶有什么作用和功效| 逍遥丸的功效和作用是什么| 人为什么会变| 了凡四训讲的是什么| 重楼的别名叫什么| 嘴巴里甜甜的是什么原因| 寄生虫吃什么药可以杀死| 子宫内膜炎是什么原因造成的| 西安古代叫什么名字| 化妆品属于什么行业| 爸爸的爸爸叫什么儿歌| 成人自考本科需要什么条件| 黄瓜为什么会苦| 耳结是什么原因造成的| 缺少电解质有什么症状| 排骨炖什么比较好吃| 胰岛素是什么器官分泌的| 轻度抑郁症吃什么药| 什么东西补精子最快| 什么是稽留流产| gi值是什么意思| 潴留性囊肿是什么意思| 老叹气是什么原因| 睡觉身上痒是什么原因| 检查肝做什么检查| 宫颈那囊是什么| lcr是什么意思| 百度
打印
[复制链接]
1336|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanglinq|  楼主 | 2025-08-04 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yanglinq 于 2025-08-04 16:48 编辑

/有个项目IO口不够用,又不想换大的CPU,只好用了个QFN24的小芯片通过模拟 IIC来扩展IO口。

/********************************************************************************/
/* @file        xl9555.c                                                                                                                        */
/* @version        V1.00                                                                                                                                */
/* $author:        yuanxihua@21cn.com                                                                                                        */
/* $Date:         2023/09/13 01:54 $                                                                                                         */
/* @brief         SWM181CBT6 Series XL9555 Driver Sample Code                                                        */
/*                                                                                                                                                                */
/* @NOTE                                                                                                                                                */
/* Copyright (C) 2010-2023 PM9GZY Technology Corp. All rights reserved.                        */
/*                                                                                                                                                                */
/********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/*
_________________________________________________
|        SWM181CBT6                                                XL9555                |
|                                                                                                |
|        PB2                SCL                 ---->                SCL                        |
|        PB1                SDA                 <--->                SDA                        |
|        PE4                INT                        <---                 INT                        |
|_______________________________________________|
*/
#include <stdint.h>
/* Private typedef -----------------------------------------------------------*/
#define I2C_Delay                              10                         /* us */
#define I2C_SCL                            GPIOB, PIN2
#define I2C_SDA                            GPIOB, PIN1
#define I2C_INT                            GPIOE, PIN4

/* Private define ------------------------------------------------------------*/
#define XL9555_SLAVEADDR                         0x42                         /* Clock i2c slave address */
/* Private macro -------------------------------------------------------------*/
#define XL9555_INPUT_PORT0                                0x00
#define XL9555_INPUT_PORT1                                0x01
#define XL9555_OUTPUT_PORT0                                0x02
#define XL9555_OUTPUT_PORT1                                0x03
#define XL9555_POLARITY_PORT0                        0x04
#define XL9555_POLARITY_PORT1                        0x05
#define XL9555_CONFIGURATION_PORT0                0x06
#define XL9555_CONFIGURATION_PORT1                0x07
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/
void XL9555_Init(void)
{
        GPIO_Init(I2C_INT, 0, 1, 0, 0);                //GPIOE.4 配置为输入引脚,开启上拉 INT
        GPIO_Init(I2C_SDA, 1, 0, 0, 0);                //GPIOB.1 配置为输出引脚,推挽输出 SDA
        GPIO_Init(I2C_SCL, 1, 0, 0, 0);                //GPIOB.2 配置为输出引脚,推挽输出 SCL
        GPIO_SetBit(I2C_SCL);                                //SCL 高
        GPIO_SetBit(I2C_SDA);                                //SDA 高
}
void XL9555_Pluse(void)
{
        GPIO_SetBit(I2C_SCL);                                //SCL 高
        delay_us(I2C_Delay);
        GPIO_ClrBit(I2C_SCL);                                //SCL 低
        delay_us(I2C_Delay);
}
void XL9555_Start(void)
{
        XL9555_Init();
        delay_us(I2C_Delay);
        GPIO_Init(I2C_SDA, 1, 0, 0, 0);                //I2C_SDA 配置为输出引脚,推挽输出 SDA
        GPIO_ClrBit(I2C_SDA);                                //SDA 低
        delay_us(I2C_Delay);
        GPIO_ClrBit(I2C_SCL);                                //SCL 低
        delay_us(I2C_Delay);
}
void XL9555_ACK(uint8_t ack)
{
        GPIO_Init(I2C_SDA, 1, 0, 0, 0);                //I2C_SDA 配置为输出引脚,推挽输出 SDA
        if(ack)        {GPIO_SetBit(I2C_SDA);}                //SDA 高 NAK
        else        {GPIO_ClrBit(I2C_SDA);}                //SDA 低 ACK
        delay_us(I2C_Delay);
        XL9555_Pluse();                                                //发送ACK
        GPIO_SetBit(I2C_SDA);                                //SDA 高         /* CPU释放SDA总线 */
}
uint8_t XL9555_WACK(void)
{
        GPIO_Init(I2C_SDA, 0, 1, 0, 0);                //I2C_SDA 配置为输入引脚,开启上拉 SDA
        delay_us(I2C_Delay);
        uint8_t ack=GPIO_GetBit(I2C_SDA);        //接收ACK
        XL9555_Pluse();                       
        return ack;
}
void XL9555_Stop(void)
{
        GPIO_Init(I2C_SDA, 1, 0, 0, 0);                //I2C_SDA 配置为输出引脚,推挽输出 SDA
        GPIO_ClrBit(I2C_SDA);                                //SDA 低
        delay_us(I2C_Delay);
        GPIO_SetBit(I2C_SCL);                                //SCL 高
        delay_us(I2C_Delay);
        GPIO_SetBit(I2C_SDA);                                //SDA 高
}
void XL9555_Send_Byte(uint8_t data,uint8_t ack)
{
        GPIO_Init(I2C_SDA, 1, 0, 0, 0);                //I2C_SDA 配置为输出引脚,推挽输出 SDA
        for(int i=0;i<8;i++)                                //发送DATA
        {
                if(data&0x80){GPIO_SetBit(I2C_SDA);}
                else{GPIO_ClrBit(I2C_SDA);}
                data<<=1;XL9555_Pluse();
        }
        if(XL9555_WACK()!=ack){XL9555_Stop();}        //等待ACK应答
}
uint16_t XL9555_Read_Byte(uint8_t ack)
{
        uint16_t data=0;
        GPIO_Init(I2C_SDA, 0, 1, 0, 0);                //I2C_SDA 配置为输入引脚,开启上拉 SDA
        for(int i=0;i<8;i++)                                //接收DATA
        {
                data<<=1;
                if(GPIO_GetBit(I2C_SDA)){data+=1;}else{;}
                XL9555_Pluse();
        }
        XL9555_ACK(ack);                //发送ACK或者NAK
        return data;
}

uint8_t XL9555_Write_buf(uint8_t addr,uint8_t reg,uint8_t *buf,uint8_t len)
{
        XL9555_Init();
    XL9555_Start();
    XL9555_Send_Byte(addr|0,0);                                 //发送器件地址+写命令+ACK
    XL9555_Send_Byte(reg,0);                                 //写寄存器地址+ACK
        while(len--){XL9555_Send_Byte(*buf++,0);}        //发送数据+ACK
    XL9555_Stop();
    return 0;
}
uint8_t XL9555_Read_buf(uint8_t addr,uint8_t reg,uint8_t *buf,uint8_t len)
{
        XL9555_Init();
    XL9555_Start();
    XL9555_Send_Byte(addr|0,0);                 //发送器件地址+写命令+ACK
    XL9555_Send_Byte(reg,0);                 //写寄存器地址+ACK
        XL9555_Start();               
    XL9555_Send_Byte(addr|1,0);                 //发送器件地址+读命令+ACK
    while(len--)
    {
        if(len==1)        {*buf++=XL9555_Read_Byte(1);}        //读数据+发送NAK
                else                 {*buf++=XL9555_Read_Byte(0);}        //读数据+发送ACK  
    }
    XL9555_Stop();                                 //产生一个停止条件
    return 0;      
}
void XL9555_Configuration(uint16_t val)
{
    XL9555_Write_buf(XL9555_SLAVEADDR, XL9555_CONFIGURATION_PORT0,(uint8_t *)&val,2);
}

void XL9555_OutPut(uint16_t val)
{
        XL9555_Configuration(0x0000);
        XL9555_Write_buf(XL9555_SLAVEADDR, XL9555_OUTPUT_PORT0,(uint8_t *)&val,2);
}

uint16_t XL9555_InPut(void)
{
        uint16_t val;
        XL9555_Configuration(0xffff);
        XL9555_Write_buf(XL9555_SLAVEADDR, XL9555_OUTPUT_PORT0,(uint8_t *)&val,2);
        return val;
}
uint16_t XL9555_InOutPut(uint16_t set,uint16_t val)
{
        XL9555_Configuration(set);
        uint8_t *buf=( uint8_t *)&val;
        XL9555_Write_buf(XL9555_SLAVEADDR, XL9555_OUTPUT_PORT0,buf,2);
        delay_us(1000);
        XL9555_Read_buf (XL9555_SLAVEADDR, XL9555_INPUT_PORT0 ,buf,2);
        return val;
}

void XL9555_Test(void)
{
        uint8_t buf[8];
        XL9555_Read_buf(XL9555_SLAVEADDR,0,buf,sizeof(buf));
        for(int i=0;i<sizeof(buf);i++){printf("0x%02x ",buf);}
}

//代码完毕



相关帖子

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

本版积分规则

7

主题

7

帖子

0

粉丝
生理盐水有什么作用 怀孕不能吃什么药 什么是碳酸饮料 炒什么菜好吃又简单 脖子痛是什么原因
舌头起泡什么原因 美国为什么不敢打伊朗 mds是什么病的简称 大美是什么意思 血红蛋白偏低是什么意思
诸位是什么意思 心绪不宁的意思是什么 豆工念什么 无妄之灾什么意思 肾虚吃什么药最有效
什么样的女人性欲强 菜心是什么菜的心 什么是感情 羊肉和什么菜包饺子好吃 兰花是什么季节开的
流产是什么样子的hcv9jop0ns0r.cn 挚肘是什么意思wmyky.com 戊肝是什么病hcv8jop9ns4r.cn jj是什么意思hcv7jop6ns0r.cn 赤小豆是什么hcv8jop5ns7r.cn
血糖高适合吃什么水果hcv9jop5ns9r.cn 吹面不寒杨柳风什么意思qingzhougame.com 女人腰椎疼是什么原因hcv7jop9ns4r.cn 面色晄白是什么意思hcv7jop9ns2r.cn 水是由什么组成的hanqikai.com
天相是什么意思helloaicloud.com 簸箕是什么东西dayuxmw.com 左耳嗡嗡响吃什么药hcv8jop7ns5r.cn hpv52型阳性是什么意思严重吗jinxinzhichuang.com 鸡血藤长什么样子图片hcv8jop6ns6r.cn
产值是什么hcv9jop4ns8r.cn 流口水吃什么药最好creativexi.com 尿胆原norm是什么意思baiqunet.com 听佛歌有什么好处hcv9jop3ns7r.cn 梦到和老公吵架是什么意思hcv9jop3ns6r.cn
百度