I/O芯片扩展开发
QCA9563外接I/O擴展芯片
- 概述
- 實現
- 總結
概述
CPU上的GPIO口特別有限,所以想著給現有的單板做一個I/O擴展。方案是QCA9563通過I2C,外接MCP23017,可以外出16路I/O口。配置I/O口為固定方向,8個為一組,一組輸出一組輸入。
實現
剛開始打算直接通過QCA9563自帶的I2C口控制器進行控制MCP23017芯片,但是在開發的過程中才發現沒有I2C控制器驅動代碼??赡苡捎谶@款芯片太新了,開源代碼還沒有適配,最后想著用GPIO模擬I2C的方式進行控制的。
提供讀寫接口:#define MCP23017_ADDRESS 0x20 /* mcp23017 address 通過查手冊和硬件走線即可確定*/ //通過/dev/i2c-0設備進行讀 int mcp23017_read(unsigned char regaddr, unsigned char *value) {int ret = 0;/* read data from mcp23017 *//* we used to start singnal */memset(buf1, 0, sizeof(buf1));memset(buf2, 0, sizeof(buf2));i2c_data.nmsgs = 2;i2c_data.msgs[0].len = 1;i2c_data.msgs[0].addr = MCP23017_ADDRESS;i2c_data.msgs[0].flags = 0; /* write */i2c_data.msgs[0].buf = buf1;buf1[0] = regaddr; /* regaddr */i2c_data.msgs[1].len = 1; /* test read twice ,2 */i2c_data.msgs[1].addr = 0x20;i2c_data.msgs[1].flags = I2C_M_RD;i2c_data.msgs[1].buf = buf2; /* read buff */ret = ioctl (i2c_fd, I2C_RDWR, (unsigned long)&i2c_data);if (ret < 0){ #ifdef IOEXTEND_DEBUGprint_file("[%s %d]ioctl read error\n", __FILE__, __LINE__); #endifreturn RET_ERR;}*value = buf2[0]; #ifdef IOEXTEND_DEBUGprint_file("[%s %d]%s value:0x%2x\n", __FILE__, __LINE__, register_to_string[regaddr], buf2[0]); #endifreturn RET_OK; } //通過/dev/i2c-0設備進行寫 int mcp23017_write(unsigned char regaddr, unsigned char value) {int ret = 0;/* write data to mcp23017 */i2c_data.nmsgs = 1;i2c_data.msgs[0].len = 2;i2c_data.msgs[0].addr = MCP23017_ADDRESS; /* 0100 A2A1A0 R/W 7-bit i2c addresses */i2c_data.msgs[0].flags = 0; /* write */i2c_data.msgs[0].buf = buf1;buf1[0] = regaddr; /* regaddr*/buf1[1] = value; /* write value */ret = ioctl (i2c_fd, I2C_RDWR, (unsigned long)&i2c_data);if (ret < 0){ #ifdef IOEXTEND_DEBUGprint_file("[%s %d]ioctl read error\n", __FILE__, __LINE__); #endifreturn RET_ERR;}return RET_OK; } //初始化/dev/i2c-0 int mcp23017_init() {i2c_fd = open("/dev/i2c-0", O_RDWR);if (i2c_fd < 0){ #ifdef IOEXTEND_DEBUGprint_file("[%s %d]Error on opening the /dev/i2c-0 file i2c_fd:%d\n", __FILE__, __LINE__, i2c_fd); #endifreturn RET_ERR;}ioctl(i2c_fd, I2C_TIMEOUT, 2);ioctl(i2c_fd, I2C_RETRIES, 1);i2c_data.nmsgs = 2;i2c_data.msgs = (struct i2c_msg *)malloc(i2c_data.nmsgs * sizeof(struct i2c_msg));if (!i2c_data.msgs){ #ifdef IOEXTEND_DEBUGprint_file("[%s %d]Memory alloc error\n", __FILE__, __LINE__); #endifclose(i2c_fd);return RET_ERR;}mcp23017_write(REG_IODIRA, 0x00); /* out put module */mcp23017_write(REG_IODIRB, 0xff); /* in put module */mcp23017_write(REG_GPIOA, 0xff);return RET_OK; }
總結
通過read、write接口就可以控制MCP23017芯片,如果想要實時獲取芯片上的狀態,需要把芯片上的中斷引腳解出來,根據中斷來讀。或者采用輪詢模式進行讀狀態。
總結
- 上一篇: QT添加rtmp库的时候出现问题
- 下一篇: JAVA编程心得-Eclipse/MyE