完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
分享一个用STM32F103为主控芯片,通过IIC与TCA9555扩展芯片通讯,1路IIC可以扩展128个IO口,2路IIC可以扩展256个IO口,以此类推。
篇幅有限,以下是主要实现的代码,如果需要完整代码加我V:hec_558,或者Q:1194459751 #define CFG_ADR 0x06 #define INT_ADR 0x00 #define OUT_ADR 0x02 #define ALLIN 0xFF #define ALLOUT 0x00 #define PIN0 0x01 #define PIN1 0x02 #define PIN2 0x04 #define PIN3 0x08 #define PIN4 0x10 #define PIN5 0x20 #define PIN6 0x40 #define PIN7 0x80 U16 GPIO_STA=0xffff; U8 WriteAddr_CAT9555=0x00; U8 ReadAddr_CAT9555=0x01; /* 函数名:CAT9555_CH_CS 函数功能:切换芯片硬件地址 返回值:无 参数(ch)1:CAT9555地址选择; */ //******************************CAT9555地址通道切换 void CAT9555_CH_CS(U8 ch){ if(ch==1){ WriteAddr_CAT9555=0x40;//0100 0000 ReadAddr_CAT9555=0x41; //0100 0001 } else if(ch==2){ WriteAddr_CAT9555=0x42;//0100 0010 ReadAddr_CAT9555=0x43; //0100 0011 } else if(ch==3){ WriteAddr_CAT9555=0x44; ReadAddr_CAT9555=0x45; } else if(ch==4){ WriteAddr_CAT9555=0x46; ReadAddr_CAT9555=0x47; } else if(ch==5){ WriteAddr_CAT9555=0x48; ReadAddr_CAT9555=0x49; } else if(ch==6){ WriteAddr_CAT9555=0x4A; ReadAddr_CAT9555=0x4B; } else if(ch==7){ WriteAddr_CAT9555=0x4C; ReadAddr_CAT9555=0x4D; } else if(ch==8){ WriteAddr_CAT9555=0x4E; ReadAddr_CAT9555=0x4F; } } //*********************************************CAT9555初始化 void CAT9555_Init(U8 iich,U8 addrch){ CAT9555_CH_CS(addrch); //将IIC总线扩展切换到指定通道地址 delay_ms(100); IIC_Start(iich); IIC_Send_Byte(iich,WriteAddr_CAT9555); //写硬件地址 IIC_Wait_Ack(iich); IIC_Send_Byte(iich,CFG_ADR); //写配置寄存器地址 IIC_Wait_Ack(iich); IIC_Send_Byte(iich,ALLIN); //写配置数据 端口0 全为输入 IIC_Wait_Ack(iich); IIC_Send_Byte(iich,ALLOUT); //写配置数据 端口1 全为输出 IIC_Wait_Ack(iich); IIC_Stop(iich); } /* 函数名:CAT9555_Output 函数功能:将指定引脚IO输出高电平或低电平 返回值:无 参数(iich)1:i2c通道选择; 参数(addrch)2:CAT9555地址选择--由A0,A1,A2决定,CAT9555_CH_CS(addrch)函数切换 参数(bitnum)3:输入输出--引脚(引脚顺序:PIN0--PIN7对应P00--P07,PIN8--PIN15对应P10--P17) 参数(Status)4:输出状态---1.高电平。0.低电平 */ //**********************************************CAT9555输出 void CAT9555_Output(U8 iich,U8 addrch,U8 bitnum,U8 status){ U8 L8bit,H8bit; GPIO_STA=(GPIO_STA &(~(1< H8bit=GPIO_STA>>8; L8bit=GPIO_STA&0xff; CAT9555_CH_CS(addrch); //将IIC总线扩展切换到指定通道地址 delay_ms(100); IIC_Start(iich); IIC_Send_Byte(iich,WriteAddr_CAT9555); //写硬件地址 IIC_Wait_Ack(iich); //等待应答 IIC_Send_Byte(iich,OUT_ADR); //写输出寄存器地址 IIC_Wait_Ack(iich); //应待应答 IIC_Send_Byte(iich,L8bit); //写端口0输出状态 IIC_Wait_Ack(iich); //等待应答 IIC_Send_Byte(iich,H8bit); //写端口1输出状态 IIC_Wait_Ack(iich); //等待应答 IIC_Stop(iich); } /* 函数名:CAT9555_Read 函数功能:读出指定引脚IO的高低电平状态 返回值:返回指定引脚电平状态,1=高电平,0=低电平 参数(iich)1:i2c通道选择; 参数(addrch)2:CAT9555地址选择--由A0,A1,A2决定,CAT9555_CH_CS(addrch)函数切换 参数(bitnum)3:输入输出--引脚(引脚顺序:PIN0--PIN7对应P00--P07,PIN8--PIN15对应P10--P17) */ //***********************************************CAT9555 IO读取 U8 CAT9555_Read(U8 iich,U8 addrch,U8 bitnum){ U16 rdata; U8 L8bit,H8bit; CAT9555_CH_CS(addrch); //将IIC总线扩展切换到指定通道地址 delay_ms(100); //延时100ms IIC_Start(iich); //启动 IIC_Send_Byte(iich,WriteAddr_CAT9555); //写硬件地址 IIC_Wait_Ack(iich); //等待应答 IIC_Send_Byte(iich,INT_ADR); //写控制字节切换到输入寄存器 IIC_Wait_Ack(iich); //等待应答 IIC_Start(iich); //重新启动 IIC_Send_Byte(iich,ReadAddr_CAT9555); //读硬件地址 IIC_Wait_Ack(iich); //等待应答 L8bit=IIC_Read_Byte(iich,1); //读取端口0数据 H8bit=IIC_Read_Byte(iich,0); //读取端口1数据 IIC_Stop(iich); //停止 rdata=(H8bit<<8)|L8bit; rdata=(rdata>>bitnum)&0x01; return rdata; } |
|
相关推荐
|
|
OV7670摄像头使用串口发送数据到另一个板子上的lcd,出现花屏
1375 浏览 1 评论
692 浏览 0 评论
674 浏览 0 评论
STM32CUBEMX(12)--IIC,12864OLED(0.96寸)移植
712 浏览 0 评论
STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式
648 浏览 0 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-28 23:02 , Processed in 0.609167 second(s), Total 70, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号