⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpio_expander.c

📁 单片机控制的使用MAX7318的一种IO口扩展程序单片机控制的使用MAX7318的一种IO口扩展程序
💻 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 + -