在上一篇设计的扩展板上,使用I2C通信的PCF8574扩展了8位IO口,下面测试下输入和输出。
一、硬件电路
硬件电路上使用了PA8和PA9 I2C通信接口,预留PA31中断接口。
1.1、电路图1
1.2、按键电路
1.3、板卡连接插件位置
二、程序部分
2.1、pcf8574.c
//pcf8574.c
#include "board_config.h"
#include "drv/gpio_pin.h"
#include <drv/pin.h>
#include <aos/aos.h>
#include "stdio.h"
#include "drv/iic.h"
#define IIC_SLAVE_ADDR 0x21
#define IIC_MEM_ADDR 0x0010
#define IIC_IDX 0
static csi_iic_t master_iic;
static void pcf8574_pinmux_init(void)
{
csi_pin_set_mux(PA8, PA8_IIC0_SCL );
csi_pin_set_mux(PA9, PA9_IIC0_SDA);
}
int pcf8574_init(void)
{
uint8_t write_data[1];
csi_error_t ret;
uint32_t num;
uint32_t i;
pcf8574_pinmux_init();
ret = csi_iic_init(&master_iic, IIC_IDX);
if (ret != CSI_OK) {
printf("csi_iic_initialize error\n");
return -1;
}
/* config iic master mode */
ret = csi_iic_mode(&master_iic, IIC_MODE_MASTER);
if (ret != CSI_OK) {
printf("csi_iic_set_mode error\n");
return -1;
}
/* config iic 7bit address mode */
ret = csi_iic_addr_mode(&master_iic, IIC_ADDRESS_7BIT);
if (ret != CSI_OK) {
printf("csi_iic_set_addr_mode error\n");
return -1;
}
/* config iic standard speed*/
ret = csi_iic_speed(&master_iic, IIC_BUS_SPEED_STANDARD);
if (ret != CSI_OK) {
printf("csi_iic_set_speed error\n");
return -1;
}
write_data[0]=0xff;
csi_iic_master_send(&master_iic, IIC_SLAVE_ADDR, write_data, 1, 100);
}
void pcf8574_test(void)
{
uint8_t wdat[2];
uint8_t rdat[2];
uint8_t num;
wdat[0]=0x7F;
csi_iic_master_send(&master_iic, IIC_SLAVE_ADDR, wdat, 1, 100);
aos_msleep(100);
wdat[0]=0xBF;
csi_iic_master_send(&master_iic, IIC_SLAVE_ADDR, wdat, 1, 100);
aos_msleep(100);
num = csi_iic_master_receive(&master_iic, IIC_SLAVE_ADDR, rdat, 1, 100);
printf("read key value=%x\n",rdat[0]);
}
2.2、main.c
#include <stdlib.h>
#include <string.h>
#include <aos/aos.h>
#include "aos/cli.h"
#include "main.h"
#include "app_init.h"
#include "oled.h"
#include "led.h"
#include "pcf8574.h"
#define TAG "app"
int main(void)
{
board_yoc_init();
LOGD(TAG, "%s\n", aos_get_app_version());
oled_init();
led_init();
pcf8574_init();
while (1) {
//LOGD(TAG, "Hello world! YoC");
//aos_msleep(1000);
//led_test();
pcf8574_test();
}
return 0;
}
三、运行结果