打印
[其他ST产品]

分享STM32F103_TCA9555(IIC通讯扩展IO口例程)

[复制链接]
477|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2022-4-11 10:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享一个用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;               
        }
}

使用特权

评论回复
沙发
两只袜子|  楼主 | 2022-4-11 11:00 | 只看该作者
//*********************************************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<<bitnum)))|(status<<bitnum);
         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;
}

使用特权

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

本版积分规则

1884

主题

6474

帖子

8

粉丝