记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。

LiSun

记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
#include "pca9555.h"
/******************
笔记:pca9555.pdf
1、P17-控制寄存器和命令字节
2、P17-特性:如果之前有发送命令地址,则读数据命令,会从上个地址顺延,并读取数据。直到发送了新的命令地址。
3、P10-通讯过程:IIC启动-->发送器件识别地址1byte(0bit=R1/W0)-->ACK-->发送器件寄存器地址-->ACK-->[读数据/写数据]1byte
*******************/
U_INPUT   EX_IN;
U_OUTPUT  EX_OUT;

/******************************
函数名:PCA9555Init
功  能:初始化器件两组IO口的引脚功能
形  参:PIN--器件信息结构体
返回值:
备  注:
*******************************/
IIC_STATUS PCA9555Init(const IIC_PIN *PIN)
{
    IIC_STATUS status;

    IIC_Init(PIN);
    IIC_Start(PIN);
    IIC_WriteByte(PIN, PIN->ADDR);             //发送器件识别地址+写
    status = IIC_Wait_ACK(PIN);
//  IIC_WriteByte(PIN, PCA9555_REG_POL0);
//  status |= IIC_Wait_ACK(PIN);
//  IIC_WriteByte(PIN, PCA9555_POLARITY0);
//  status |= IIC_Wait_ACK(PIN);
//  IIC_WriteByte(PIN, PCA9555_POLARITY1);
//  status |= IIC_Wait_ACK(PIN);
    IIC_WriteByte(PIN, PCA9555_REG_CFG0);     //寄存器地址写入(配置PIN脚为输入或输出)
    status |= IIC_Wait_ACK(PIN);
    IIC_WriteByte(PIN, PCA9555_DERECTION0);   //设置IO0的0-7引脚全部为输入模式,因为与拨码器连接,作为IPADDR使用。
    status |= IIC_Wait_ACK(PIN);
    IIC_WriteByte(PIN, PCA9555_DERECTION1);   //设置IO1的0-3引脚为输入,4-7为引脚为输出。
    status |= IIC_Wait_ACK(PIN);
    IIC_Stop(PIN);

    if(status)
        return(IIC_WRITE_ERR);
    else
        return(IIC_OK);
}

/******************************
函数名:PCA9555GetPin
功  能:从器件读取引脚状态
形  参:PIN--器件信息结构体 pin--存放引脚状态结构体
返回值:
备  注:
*******************************/
IIC_STATUS PCA9555GetPin(const IIC_PIN *PIN, U_INPUT *pin)
{
    uint8_t ch[2];
    IIC_STATUS status;

    IIC_Start(PIN);
    IIC_WriteByte(PIN, PIN->ADDR);              //发送器件地址+写命令
    status = IIC_Wait_ACK(PIN);
    IIC_WriteByte(PIN, PCA9555_REG_IN0);        //发送器件寄存器地址--0x00--输入寄存器0地址
    status |= IIC_Wait_ACK(PIN);

    IIC_Start(PIN);
    IIC_WriteByte(PIN, PIN->ADDR | 0x01);       //发送器件地址+读命令
    status |= IIC_Wait_ACK(PIN);
    IIC_ReadByte(PIN, &ch[0]);                  //读取[输入寄存器0]的数据
    IIC_ACK(PIN);
    IIC_ReadByte(PIN, &ch[1]);                  //读取[输入寄存器1]的数据(特性:地址自动顺延)
    IIC_NACK(PIN);
    IIC_Stop(PIN);

    if(status)
        return (IIC_READ_ERR);
    else
    {
        pin->input[0] = ch[0];
        pin->input[1] = ch[1];
        return (IIC_OK);
    }
}

/******************************
函数名:PCA9555SetPin
功  能:设置器件的扩展IO口电平状态
形  参:PIN--器件信息结构体   pout--存放引脚状态结构体
返回值:
备  注:设置的值,只对之前配置为输出模式的引脚有效,输入模式的引脚无效。
*******************************/
IIC_STATUS PCA9555SetPin(const IIC_PIN *PIN, const U_OUTPUT *pout)
{
    IIC_STATUS status;

    IIC_Start(PIN);
    IIC_WriteByte(PIN, PIN->ADDR);
    status = IIC_Wait_ACK(PIN);
    IIC_WriteByte(PIN, PCA9555_REG_OUT0);
    status |= IIC_Wait_ACK(PIN);
    IIC_WriteByte(PIN, pout->output[0]);
    status |= IIC_Wait_ACK(PIN);
    IIC_WriteByte(PIN, pout->output[1]);
    status |= IIC_Wait_ACK(PIN);
    IIC_Stop(PIN);
    osDelay(10);
    if(status)
        return (IIC_WRITE_ERR);
    else
        return (IIC_OK);
}

#ifndef __PCA9555_HEAD_
#define __PCA9555_HEAD_

#include "stdio.h"
#include "stdint.h"
#include "string.h"
#include "cmsis_os.h"
#include "hal_iic.h"

/********************* 个人自定义PAC9555的寄存器参数值***********************/
#define	PCA9555_POLARITY0				0x00									//极性反转值0(0不反转 1反转,PIN脚为输入时有效,)
#define	PCA9555_POLARITY1				0x00									//极性反转值1
#define	PCA9555_DERECTION0			0xFF									//方向配置值0 (0输出 1输入)
#define	PCA9555_DERECTION1			0x0F									//方向配置值1  高4位输出脚,低四位输入脚

/********************* 定义PAC9555的寄存器地址 ***********************/
#define	PCA9555_REG_IN0					0x00									//输入寄存器0地址    	
#define	PCA9555_REG_IN1					0x01									//输入寄存器1地址    
#define	PCA9555_REG_OUT0				0x02									//输出寄存器0地址    
#define	PCA9555_REG_OUT1				0x03									//输出寄存器1地址    
#define	PCA9555_REG_POL0				0x04									//极性反转寄存器0地址(PIN脚为输入时有效)    
#define	PCA9555_REG_POL1				0x05									//极性反转寄存器1地址 
#define	PCA9555_REG_CFG0				0x06									//方向配置寄存器0地址    
#define	PCA9555_REG_CFG1				0x07									//方向配置寄存器1地址


typedef struct{
  GPIO_TypeDef* port;
  uint16_t      pin;
}T_GPIO_TYPE;

/*存放PCA9555扩展口的引脚电平状态*/
typedef union{
  uint8_t  input[2];
  uint16_t data;
}U_INPUT;

/*需要对PCA9555扩展口的输出引脚设置电平信息*/
typedef union{
  uint8_t  output[2];
  uint16_t data;
}U_OUTPUT;

extern U_INPUT	EX_IN;
extern U_OUTPUT EX_OUT;
IIC_STATUS PCA9555Init(const IIC_PIN *PIN);
IIC_STATUS PCA9555GetPin(const IIC_PIN *PIN,U_INPUT *pin);
IIC_STATUS PCA9555SetPin(const IIC_PIN *PIN,const U_OUTPUT *pout);

#endif

pca9555.pdf

posted on 2022-08-13 11:01  嵌入式单片机实验室  阅读(655)  评论(0)    收藏  举报
记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。