文章目录
前言
今天突然看到了嵌入式考证设备上的蜂鸣器有个是根据PCA9557扩展io口来使能蜂鸣器鸣叫,正好刚刚更新完蜂鸣器那就把PCA9557讲一下吧。
大家多多关注,我更新的动力来源于大家的支持,有问题都欢迎私信我。
一、PCA9557是什么?
因为考证设备很多io口已经固定在板子之中,有些也无法复用,所以我们就可以利用PCA9557来扩展io口,挂到IiC上,然后一下增加8个GPIO,特别爽。
注:PCA9557 用作 GPIO 扩展,设计和使用本芯片的目的是不占用 1B 芯片的 GPIO 资源。
源代码:ls1x‐drv/i2c/pca9557/pca9557.c
头文件:ls1x‐drv/include/i2c/pca9557.h
PCA9557 是否使用,在 bsp.h 中配置宏定义: #define PCA9557_DRV PCA9557
挂接在 I2C0 上,I2C 地址和通信速率定义如下(pca9557.c):
#define PCA9557_ADDRESS 0x1C /* 7 位地址 */
#define PCA9557_BAUDRATE 100000 /* 100K */
二、驱动程序 pca9557.c 实现的函数:
int PCA9557_init(void *dev, void *arg); 初始化
int PCA9557_read(void *dev, void *buf, int size, void *arg); 读数据
int PCA9557_write(void *dev, void *buf, int size, void *arg); 写数据
PCA9557_read 读 1 字节的输入寄存器;
PCA9557_write 写 1 字节的输出寄存器
三、i2c驱动函数
1.BSP文件说明
源代码:ls1x‐drv/i2c/ls1x_i2c_bus.c
头文件:ls1x‐drv/include/ls1x_i2c_bus.h
I2C 设备是否使用,在 bsp.h 中配置宏定义: #define BSP_USE_I2C0 //#define BSP_USE_I2C1 //#define BSP_USE_I2C2 I2C 设备的参数,在 ls1x_i2c_bus.c 中定义: #ifdef BSP_USE_I2C0 static LS1x_I2C_bus_t ls1x_I2C0 = { .hwI2C = (struct LS1x_I2C_regs *)LS1x_I2C0_BASE, .base_frq = 0, .baudrate = 100000, .dummy_char = 0, .i2c_mutex = 0, .initialized = 0, .dev_name = "i2c0", }; LS1x_I2C_bus_t *busI2C0 = &ls1x_I2C0; #endif
2.驱动程序 ls1x_i2c_bus.c 实现的函数:
函数 功能 int LS1x_I2C_initialize(void *bus); 初始化
int LS1x_I2C_send_start(void *bus, unsigned int Addr); 获取总线控制权
int LS1x_I2C_send_stop(void *bus, unsigned int Addr); 释放总线控制权
int LS1x_I2C_send_addr(void *bus, unsigned int Addr, int rw); 发送片选信号
int LS1x_I2C_read_bytes(void *bus, unsigned char *rxbuf, int len); 读数据
int LS1x_I2C_write_bytes(void *bus, unsigned char *txbuf, int len); 写数据
int LS1x_I2C_ioctl(void *bus, int cmd, void *arg); 发送控制命令
四、PCA9557控制蜂鸣器项目代码:
#include "Beep.h"
#include "ls1x_i2c_bus.h"
#include "i2c/pca9557.h"
//初始化
void PCA9557_Init(void)
{
ls1x_i2c_initialize(busI2C0);
ls1x_pca9557_init(busI2C0,NULL);//默认端口引脚的原始极性被保留
}
//打开蜂鸣器
void Buzzer_ON(void)
{
unsigned char outData = 0x80;
ls1x_pca9557_write(busI2C0,&outData,0,0);
}
//关闭蜂鸣器
void Buzzer_OFF(void)
{
unsigned char outData = 0x00;
ls1x_pca9557_write(busI2C0,&outData,0,0);
}
void Buzzer_ON_1(void)
{
Buzzer_ON();
delay_ms(20);
Buzzer_OFF();
}
void Buzzer_ON_2(void)
{
Buzzer_ON();
delay_ms(200);
Buzzer_OFF();
}
//鸣叫三声
void Buzzer_3(void)
{
int i;
for(i=0;i<3;i++)
{
Buzzer_ON_2();
delay_ms(200);
Buzzer_OFF();
delay_ms(200);
}
}
总结
总测试代码并不是完整,其中很多有问题,但PCA9557是测试没问题的,大家自行学习一下,有需要私聊我。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73681.html