📄 gpio_expander.c
字号:
#include "..\includes.h"
#if CFG_GPIO_EXPANDER_EN > 0
#define LSB_ALL_ONE(n) ( ((n)<32) ? (((INT32U)(1<<(n)))-1) : ~(INT32U)0 )
// MAX7318的内部寄存器地址定义
#define MAX7318_REG_INPUT_PORT1 0x00
#define MAX7318_REG_INPUT_PORT2 0x01
#define MAX7318_REG_OUTPUT_PORT1 0x02
#define MAX7318_REG_OUTPUT_PORT2 0x03
#define MAX7318_REG_POLARITY_INVERSION_PROT1 0x04
#define MAX7318_REG_POLARITY_INVERSION_PROT2 0x05
#define MAX7318_REG_CONFIG_PROT1 0x06
#define MAX7318_REG_CONFIG_PROT2 0x07
/*
*********************************************************************************************************
I/O端口扩展器初始化
*********************************************************************************************************
*/
extern void GPIOExpanderInit( struct gpio_expander_tag *pGPIO )
{
INT8U temp[4]; // 为了增加可移植性而使用
temp[0] = ((pGPIO->GPIODir) )&0xFF;
temp[1] = ((pGPIO->GPIODir)>> 8)&0xFF;
temp[2] = ((pGPIO->GPIODir)>>16)&0xFF;
temp[3] = ((pGPIO->GPIODir)>>24)&0xFF;
// 写MAX7318的端口配置寄存器
I2C_WriteMultiBytes( pGPIO->I2CSlaveAddr, MAX7318_REG_CONFIG_PROT1, temp, 1+(pGPIO->GPIOWidth-1)/8 );
}
/*
*********************************************************************************************************
读取输入口
*********************************************************************************************************
extern INT32U GPIOExpanderRead( const struct gpio_expander_tag *pGPIO )
{
INT8U temp[4]; // 为了增加可移植性而使用
INT32U port_value;
I2C_ReadMultiBytes( pGPIO->I2CSlaveAddr, MAX7318_REG_INPUT_PORT1, temp, 1+(pGPIO->GPIOWidth-1)/8 );
port_value = 0;
port_value |= temp[0];
port_value |= (temp[1]<< 8);
port_value |= (temp[2]<<16);
port_value |= (temp[3]<<24);
return port_value&LSB_ALL_ONE(pGPIO->GPIOWidth);
}
*/
/*
*********************************************************************************************************
写输出口
*********************************************************************************************************
*/
extern void GPIOExpanderWrite( const struct gpio_expander_tag *pGPIO, INT32U port_value )
{
INT8U temp[4]; // 为了增加可移植性而使用
port_value &= LSB_ALL_ONE(pGPIO->GPIOWidth);
temp[0] = (port_value )&0xFF;
temp[1] = (port_value>> 8)&0xFF;
temp[2] = (port_value>>16)&0xFF;
temp[3] = (port_value>>24)&0xFF;
I2C_WriteMultiBytes( pGPIO->I2CSlaveAddr, MAX7318_REG_OUTPUT_PORT1, temp, 1+(pGPIO->GPIOWidth-1)/8 );
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -