#ifndef _TCK9539_h_
#define _TCK9539_h_
/************************** I2C Address ***************************************/
#define TCA9539_ADDRESS 0x76 // I2C Address 0100 00 + ADDR + R/W
// ADDR tied to P2.2 of LaunchPad
/************************** I2C Registers *************************************/
#define TCA9539_INPUT_REG0 0x00 // Input status register
#define TCA9539_OUTPUT_REG0 0x02 // Output register to change state of output BIT set to 1, output set HIGH
#define TCA9539_POLARITY_REG0 0x04 // Polarity inversion register. BIT '1' inverts input polarity of register 0x00
#define TCA9539_CONFIG_REG0 0x06 // Configuration register. BIT = '1' sets port to input BIT = '0' sets port to output
//pgoog 表示输入电压范围是否在正常范围
#define TCA9539_CHG_nCE (1<<0) //0 允许充电,输出低电平表示允许充电
#define TCA9539_nCHG (1<<1) //<---充电状态指示
#define TCA9539_RF_nRST (1<<2) //1
#define TCA9539_MOTOR (1<<3) //0
#define TCA9539_BUZZER (1<<4) //0
#define TCA9539_LED0 (1<<5) //1
#define TCA9539_LED1 (1<<6) //1
#define TCA9539_BLED_G (1<<8) //0 <---P10----
#define TCA9539_BLED_R (1<<9) //0
#define TCA9539_BLED_B (1<<10) //0
#define TCA9539_KEY_UP (1<<11) //1 <---
#define TCA9539_KEY_DOWN (1<<12) //1 <---
#define TCA9539_KEY_RIGHT (1<<13) //1 <---
#define TCA9539_KEY_LEFT (1<<14) //1 <---
#define TCA9539_KEY_READ (1<<15) //1 <---P17
struct TCA9539_sBit{
unsigned char B0:1;
unsigned char B1:1;
unsigned char B2:1;
unsigned char B3:1;
unsigned char B4:1;
unsigned char B5:1;
unsigned char B6:1;
unsigned char B7:1;
};
union TCA9539_uInputPort{
unsigned char all;
struct TCA9539_sBit bit;
};
struct TCA9539_sInput{
union TCA9539_uInputPort P0;
union TCA9539_uInputPort P1;
};
union TCA9539_uInput{
unsigned short all;
struct TCA9539_sInput Port;
};
union TCA9539_uOutputP0{
unsigned char all;
struct TCA9539_sBit bit;
};
union TCA9539_uOutputP1{
unsigned char all;
struct TCA9539_sBit bit;
};
struct TCA9539_sOutput{
union TCA9539_uOutputP0 P0;
union TCA9539_uOutputP1 P1;
};
union TCA9539_uOutput{
unsigned short all;
struct TCA9539_sOutput Port;
};
union TCA9539_uPolarityInversionP0{
unsigned char all;
struct TCA9539_sBit bit;
};
union TCA9539_uPolarityInversionP1{
unsigned char all;
struct TCA9539_sBit bit;
};
struct TCA9539_sPolarityInversion{
union TCA9539_uPolarityInversionP0 P0;
union TCA9539_uPolarityInversionP1 P1;
};
union TCA9539_uPolarityInversion{
unsigned short all;
struct TCA9539_sPolarityInversion Port;
};
union TCA9539_uConfigP0{
unsigned char all;
struct TCA9539_sBit bit;
};
union TCA9539_uConfigP1{
unsigned char all;
struct TCA9539_sBit bit;
};
struct TCA9539_sConfig{
union TCA9539_uConfigP0 P0;
union TCA9539_uConfigP1 P1;
};
union TCA9539_uConfig{
unsigned short all;
struct TCA9539_sConfig Port;
};
struct sTCA9539Regs{
union TCA9539_uInput Input;
union TCA9539_uOutput Output;
union TCA9539_uPolarityInversion PolarityInversion;
union TCA9539_uConfig Config;
};
typedef struct {
union TCA9539_uInput Input;
union TCA9539_uOutput Output;
union TCA9539_uPolarityInversion PolarityInversion;
union TCA9539_uConfig Config;
} TCA9539Regs;
void TCA9539WriteConfig(TCA9539Regs * Regs);
void TCA9539WriteOutput(TCA9539Regs * Regs);
void TCA9539WritePolarity(TCA9539Regs * Regs);
void TCA9539InitDefault(TCA9539Regs* Regs);
unsigned char TCA9539InitI2CReg(TCA9539Regs* Regs);
void TCA9539ReadInputReg(void);
#endif
#include "stm32l5xx_hal.h"
#include "tck9539.h"
#include "string.h"
#define I2C_OPERATION_SUCCESSFUL 1
#define I2C_OPERATION_FAIL 0
#define TCK9539_ADDR 0xe8
#define TCK9539_RST(x) x==1 ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET)
char NACK = 0;
extern I2C_HandleTypeDef hi2c3;
extern void DelayMs(volatile unsigned int ms);
TCA9539Regs My_TCA9539Regs;
//void I2C_Write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr,uint16_t NumByteToWrite){
// HAL_I2C_Master_Transmit(&hi2c3, (uint16_t)DeviceAddr, pBuffer, NumByteToWrite, 1000);//1000ms 1s 100K字节s
//}
//void I2C_Read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToRead){
// uint8_t Register[3]={RegisterAddr};
// HAL_I2C_Mem_Read(&hi2c3,DeviceAddr,RegisterAddr,I2C_MEMADD_SIZE_8BIT,pBuffer,NumByteToRead,0xff);
// HAL_I2C_Master_Transmit(&hi2c3, (uint16_t)DeviceAddr, &RegisterAddr, 1, 1000);
// HAL_I2C_Master_Receive(&hi2c3, (uint16_t)DeviceAddr|1, pBuffer, NumByteToRead, 1000);
//}
void I2C_Write (unsigned char byte_Count, unsigned char Slave_Address, unsigned char Register_Address, unsigned char Register_Data[], unsigned char offset)
{
}
void I2C_Read (unsigned char byte_Count, unsigned char Slave_Address, unsigned char Register_Address, unsigned char* read_buffer)
{
}
unsigned int I2C_Read_Byte ( unsigned char Slave_Address, unsigned char Register_Address)
{
unsigned int MST_Data = 0;
return MST_Data;
}
/*
#define TCA9539_CHG_nCE (1<<0)
#define TCA9539_nCHG (1<<1)
#define TCA9539_RF_nRST (1<<2)
#define TCA9539_MOTOR (1<<3)
#define TCA9539_BUZZER (1<<4)
#define TCA9539_LED0 (1<<5)
#define TCA9539_LED1 (1<<6)
#define TCA9539_BLED_G (1<<8) //10----
#define TCA9539_BLED_R (1<<9)
#define TCA9539_BLED_B (1<<10)
#define TCA9539_KEY_UP (1<<11)
#define TCA9539_KEY_DOWN (1<<12)
#define TCA9539_KEY_RIGHT (1<<13)
#define TCA9539_KEY_LEFT (1<<14)
#define TCA9539_KEY_READ (1<<15) //17----
*/
// ****************************************************************************
//! @fn void TCA9539InitDefault(TCA9539Regs* Regs)
//! @brief
//! Initializes the confRegs structure which is
//! a local mirror of the TPL7200 config registers
//! additional TPL7200writeConfigRegisters(confRegs) function call
//! is needed in order to get the TPL7200 registers updated
//!
//! TODO Implement I2C return (success/failure)
// ****************************************************************************
void TCA9539InitDefault(TCA9539Regs* Regs){
Regs->Output.all = ~(TCA9539_CHG_nCE|TCA9539_MOTOR|TCA9539_BUZZER|TCA9539_BLED_G|TCA9539_BLED_R|TCA9539_BLED_B);
Regs->PolarityInversion.all = 0x0000;
//输入输出接口配置
Regs->Config.all = (TCA9539_nCHG|TCA9539_KEY_UP|TCA9539_KEY_DOWN|TCA9539_KEY_RIGHT|TCA9539_KEY_LEFT|TCA9539_KEY_READ);//1输入,0默认是输出
}
// ****************************************************************************
//! @fn void TCA9539InitI2CReg(TCA9539Regs* Regs)
//! @brief
//!
//! TODO Implement I2C return (success/failure)
// ****************************************************************************
unsigned char TCA9539InitI2CReg(TCA9539Regs* Regs){
HAL_I2C_Mem_Write(&hi2c3, (uint16_t)TCK9539_ADDR, TCA9539_CONFIG_REG0,1, (unsigned char*)&Regs->Config,2, 1000);
HAL_I2C_Mem_Write(&hi2c3, (uint16_t)TCK9539_ADDR, TCA9539_OUTPUT_REG0,1, (unsigned char*)&Regs->Output,2, 1000);
HAL_I2C_Mem_Write(&hi2c3, (uint16_t)TCK9539_ADDR, TCA9539_POLARITY_REG0,1, (unsigned char*)&Regs->PolarityInversion,2, 1000);
return 0;
}
// ****************************************************************************
//! @fn void TCA9539ReadInputReg(TCA9539Regs* Regs)
//! @brief
//!
//! TODO Implement I2C return (success/failure)
// ****************************************************************************
void TCA9539ReadInputReg(void){
HAL_I2C_Mem_Read(&hi2c3,(uint16_t)TCK9539_ADDR,TCA9539_INPUT_REG0,I2C_MEMADD_SIZE_8BIT,(unsigned char*)&My_TCA9539Regs.Input,2,0xff);
}
void EXTI9_IRQHandler(void)
{
My_TCA9539Regs.Output.Port.P1.bit.B0 = 1;
TCA9539WriteOutput(&My_TCA9539Regs);
DelayMs(500);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
TCA9539ReadInputReg();
My_TCA9539Regs.Output.Port.P1.bit.B0 = 0;
TCA9539WriteOutput(&My_TCA9539Regs);
}
// ****************************************************************************
//! @fn void TCA9539InitI2CReg(TCA9539Regs* Regs)
//! @brief
//!
//! TODO Implement I2C return (success/failure)
// ****************************************************************************
void TCA9539WriteReg(unsigned char address, unsigned char regaddress, unsigned short regVal)
{
//I2C_Write(2, address, regaddress, (regVal), 0);
if(NACK)
{
}
}
unsigned char TCA9539ReadReg(unsigned char address, unsigned char regaddress)
{
//HAL_I2C_Mem_Read(&hi2c3,(uint16_t)TCK9539_ADDR,6,I2C_MEMADD_SIZE_8BIT,tmp,2,0xff);
return (unsigned char) I2C_Read_Byte(address,regaddress);
}
void TCA9539WriteConfig(TCA9539Regs * Regs)
{
HAL_I2C_Mem_Write(&hi2c3, (uint16_t)TCK9539_ADDR,TCA9539_CONFIG_REG0,1,(unsigned char*)&Regs->Config,2, 1000);//1000ms 1s 100K字节s
}
void TCA9539WriteOutput(TCA9539Regs * Regs)
{
HAL_I2C_Mem_Write(&hi2c3, (uint16_t)TCK9539_ADDR,TCA9539_OUTPUT_REG0,1,(unsigned char*)&Regs->Output,2, 1000);//1000ms 1s 100K字节s
}
void TCA9539WritePolarity(TCA9539Regs * Regs)
{
HAL_I2C_Mem_Write(&hi2c3, (uint16_t)TCK9539_ADDR,TCA9539_POLARITY_REG0,1,(unsigned char*)&Regs->PolarityInversion,2, 1000);//1000ms 1s 100K字节s
}
void tck9539_init(void)
{
TCK9539_RST(0);
DelayMs(100);
TCK9539_RST(1);
TCA9539InitDefault(&My_TCA9539Regs);
TCA9539InitI2CReg(&My_TCA9539Regs);
//I2C_Read(tmp,TCK9539_ADDR,0,8);
}
void tck9539_test(void)
{
tck9539_init();
while(1){
}
}