基于STM32的pca9535、pca9555IO扩展板开发


前言

之前使用的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读取问题,如若用成中断触发,还需要添加以下错误机制,在我使用的时候还是发生过偶尔芯片初始化不正确,或者使用中读寄存器值不对的状态。

创作不易,请大佬们点个赞!
有问题请留言讨论!
  • 31
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 60
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 60
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值