“开发基于STM32的PCA9535和PCA9555 IO扩展板”

文章目录

  • 前言
  • 一、开发环境
  • 二、开发流程
  • 开发手册解析及使用
  • 总结

  • 前言

    之前使用的pca9535由于芯片本身有些中断问题和采购问题,目前换成了pca9555的IO扩展芯片来使用,本文章适用于这两款芯片。


    一、开发环境

    编译器: keil5
    工程库: HAL库
    芯片型号:STM32F072

    二、开发流程

    开发手册解析及使用

    pca9535和pca9555基本一样,这里我就主要说9535的手册了。
    手册下载地址网上有很多,直接去百度搜索就行了。

    1、芯片I2C地址如何确定

    如图,A2、A1、A0和其他5位共同决定了I2C的地址,其中A2、A1、A0一般硬件直接接地,在配置地址的时候需要确认这3位的状态。我这里这3位是0。所以I2C地址是0x40。

    1、芯片寄存器地址

    命令字节要在写入的时候跟随地址字节的第一个字节一起传到芯片内,分别是:
    输入端口 0 → 0
    输入端口 1 → 1
    输出端口 0 → 2
    输出端口 1 → 3
    极性反转端口 0 → 4
    极性反转端口 1 → 5
    配置端口 0 → 6
    配置端口 1 → 7

    每个端口对应的命令字节不同,可以根据自己的需求去配置这些端口,我这里就简单的配置IO为输入输出模式。


    上图说明要配置成输出模式需要将配置寄存器(6和7寄存器)的相应位置成0,要配置成输入模式要将相应位置1。

    // PCA9535命令宏
    #define  PCA9535_INPUT_PORT0_REG        0
    #define  PCA9535_INPUT_PORT1_REG        1
    #define  PCA9535_OUTPUT_PORT0_REG       2
    #define  PCA9535_OUTPUT_PORT1_REG       3
    #define  PCA9535_INVERSION_PORT0_REG    4
    #define  PCA9535_INVERSION_PORT1_REG    5
    #define  PCA9535_CONFIG_PORT0_REG       6
    #define  PCA9535_CONFIG_PORT1_REG       7
    #define  PCA9535_CONFIG_VAL0      0xE0
    #define  PCA9535_CONFIG_VAL1      0xFB 
    
    uint8_t Pca9535_Init(void)
    {
    
    	uint8_t w_data[] = {0x00, 0x00, 0x00};
    	uint8_t r_data[] = {0x00, 0x00};
    
    	// 上电先读取一次清除中断标志
    	memset(w_data, 0, sizeof(w_data));
    	
    	pca9535_read(PCA9535_INPUT_PORT0_REG, r_data, 2);
    	
    	// 配置PCA9535 端口,即写配置寄存器,数据格式为:地址 + CMD + 8 input + 8 output
    	w_data[0] = PCA9535_CONFIG_PORT0_REG;   //config_port0 寄存器
    	w_data[1] = PCA9535_CONFIG_VAL0;
    	w_data[2] = PCA9535_CONFIG_VAL1;
    	if (HAL_OK != pca9535_write(w_data, sizeof(w_data)))
    	{
    		pca9535_write(w_data, sizeof(w_data));
    		pr_debug(0x03,"pca9535_write error\n");
    		return 0;
    	}
       	return 1;
    }
    

    IO口模式配置成功后需要进行输入的读取和输出的设置。

    tips:在进行初始化前,一定要先读取一遍寄存器再进行写寄存器。原因是需要先清除中断。

    如上我就是把P07,P06,P05配置成了输入模式,P04,P03,P02,P01,P00配置成了输出模式;把P1中除了P12配置成了输出其余都配置成了输入模式。

    IO输出设置:

    uint8_t io_out(void)
    {
    		uint8_t data[] = {0x00, 0x00};		
    		data[0] = PCA9535_OUTPUT_PORT0_REG;   
    		data[1] = 0xfe; 
    		if (HAL_OK != pca9535_write(led_data, sizeof(led_data)))
    		{
    			printf("pca9535 write error\n");
    			return 0;
    		}
    		return 1;
    }
    

    如上则是把P00设置成了低电平,其余都是P0口都是高电平。

    进行写寄存器的时候直接写即可:

    HAL_StatusTypeDef pca9535_write(uint8_t *pData, uint16_t size)
    {
    	return (HAL_I2C_Master_Transmit(&hi2c1, PCA9535_ADDR, pData, size, 1000));
    }
    

    在进行读寄存器的时候需要看一下官方的iic时序,他是发了command + data0 +data1后再发送的stop命令。
    我这里调用的hal库进行读寄存器,则需要改一下官方的 HAL_I2C_Master_Receive 函数后才能调用。

    pca9535_read()读取的代码比较多,我这里就不上传了。需要的私信我即可。


    总结

    pca9535这款芯片里面还是有些小坑的,在进行stm32开发时要注意中断问题,和iic读取问题,如若用成中断触发,还需要添加以下错误机制,在我使用的时候还是发生过偶尔芯片初始化不正确,或者使用中读寄存器值不对的状态。

    创作不易,请大佬们点个赞!

    有问题请留言讨论!

    物联沃分享整理
    物联沃-IOTWORD物联网 » “开发基于STM32的PCA9535和PCA9555 IO扩展板”

    发表评论