任务功能介绍
设计一款通过I2C扩展IO的模块
- 使用2.54mm间距的连接器
- 板卡尺寸:小于40mmx40mm
- 输入信号:I2C
- 输出信号:至少8根数字I/O
- 包含电源:+5V、+3.3V、GND
本次实现的I2C的IO口扩展,使用PCF8574,来实现我们的功能。

查看手册可以知道,我们的器件其中的IO口拥有八个可以完成任务要求。
其中尺寸的要求我们使用小尺寸的封装0603来节约我们的面积。
设计思路
在设计的时候,在考虑使用的面积尽量小,就将其中的8个IO,分为俩部分,俩个排针分别4pin,大大节约我们的面积,在设计的时候也设计为IO口为俩俩一对.例如0.1是输出则2.3则是输入,来实现我们的小封装的要求,如果真的需要很多IO口使用,我们就将剩下的IO口也焊接出来。
设计框图的实现是基于手册中的参考建议复刻出来。

模块设计思路

在原理图设计的时候,通过将其中的8个IO口引出,在其中添加一个LED,来确认是否能正常驱动调试,然后将IO划分为4IO输出,4IO输入

PCB设计的时候,通过信号线联俄籍。通过左右IO排布来设计,如果需要更多IO口就将下面IO口焊接使用,如果使用不到,可以暂时不焊接,节省PCB的排布资源。
模块打板
在得捷上购买的主控很快就到手了,板子打过来就立马焊接完成。
效果图如下。

为了小封装,一边是I2C的接口实现,一边是引出2*2的输入输出IO口来配置,因为输入引脚需要添加上拉电阻,在设计的时候,就将其中分别错开来设计,将一半的引脚先不焊接,假如后面开发IO真的不够用,就将其中焊接上,为了扩展使用,在简单使用就可以剩下一些引脚占用。
设计流程框图

调试代码
本次实现就是将我们第一次和第二期的结合,测试我们的IO点亮小灯,通过I2C的方式实现。
根据手册我们可以知道,其中的I2C的地址,A1A2A3,其中都是GND。

我们写I2C地址是70,就将其中设置为我们写地址的相关函数。
软件代码
其中使用stm32cubemx生成我们的I2C接口配置。

#define PCF8574A_ADDR 0x70
void PCF8574A_SetP7Low_Direct(void) {
uint8_t data = 0x7F;
HAL_I2C_Master_Transmit(&hi2c1, PCF8574A_ADDR, &data, 1, 100);
}
void PCF8574A_SetP7Higt_Direct(void) {
uint8_t data = 0xFF;
HAL_I2C_Master_Transmit(&hi2c1, PCF8574A_ADDR, &data, 1, 100);
}
主循环
while (1)
{
/* USER CODE END WHILE */
PCF8574A_SetP7Higt_Direct();
HAL_Delay(1000);
PCF8574A_SetP7Low_Direct();
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
实现的效果是接上LED灯1ms在闪烁,其中LED正极接电源,负极接P7,通过其中IO的配置,来实现我们的电平的修改。
效果图展示
高电平的情况下我们的小灯灭

在低电平的情况下我们的小灯导通

心得体会
本次也是对自己的一次突破,也是将自己画好的俩个板子,联动调试,实现我们点亮小灯的测试,也在我们学习原理图的基础上,增加了自己动手实践的机会,感谢这次的活动。