TSM12M TSM12 STM8L152C6, STM8L152R8 MSP430F5325 whym1987@126.com! /******************************************************************************* * : TSM12.c * : * : 2013/10/21 * : TSM12, STM8L f(sysclk) = 4 MHz 8MHz TIM_DLY_CNT ****************************************************************************** #include "TSM12.h" #include "key.h" u8 fg_tsm_int = 0; /* extern void delay_ms(u16 n_ms); void TSM12_IO_Init(PWR_Mode_TypeDef pwr_st) if(pwr_st == PWR_LPM) scl, sda, en GPIO_Init(TSM_GPIO_PORT, TSM_SCL_PIN TSM_SDA_PIN TSM_EN_PIN, GPIO_Mode_Out_PP_High_Fast);
INT GPIO_Init(TSM_GPIO_PORT, TSM_INT_PIN, GPIO_Mode_In_PU_IT); EXTI_SetPinSensitivity(TSM_EXTI_INT_PIN, EXTI_Trigger_Falling); KeyValue_Last = KeyValue= KeyValue_Ready = keynull; if(pwr_st == PWR_ACTIVE) INT GPIO_Init(TSM_GPIO_PORT, TSM_INT_PIN, GPIO_Mode_In_PU_No_IT); void TSM12_IO_Init(void) GPIO_Init(TSM_GPIO_PORT, TSM_EN_PIN TSM_SDA_PIN TSM_SCL_PIN, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(TSM_INT_GPIO_PORT, TSM_INT_PIN, GPIO_Mode_In_FL_IT); EXTI_SetPinSensitivity(EXTI_Pin_2, EXTI_Trigger_Falling); /******************************************************************************* * : * : * : * : 4MHZ nop() ******************************************************************************
static void delayus(u8 dat) for(u8 i=0; i<dat; i++) IWDG->KR = IWDG_KEY_REFRESH; Clear_WDT(); nop(); nop(); nop(); nop(); /* static void I2C_Start(void) TSM_SDA_OUT(); TSM_SCL_H; TSM_SDA_H; TSM_SDA_L; /* 4.7us TSM_SCL_L; /* static void I2C_Stop(void)
TSM_SDA_OUT(); TSM_SCL_L; TSM_SDA_L; TSM_SCL_H; TSM_SDA_H; /* This function sends a device Ack or NAck signal When you want to send ACK signal to slave device, you make back 0. When you want to send NACK signal to slave device, you make back 1. NONE static void I2C_SendAck(u8 back) TSM_SDA_OUT(); if(back) TSM_SDA_H; else TSM_SDA_L; TSM_SCL_H; delayus(5); TSM_SCL_L;
/* ACK 0- ACK 1- ACK static u8 I2C_WaitAck(void) volatile u16 i; TSM_SDA_IN(); if(tsm_sda_read()) TSM_SCL_L; return 1; TSM_SCL_L; return 0; /* dat ( ) 8 dat dat static void I2C_WriteByte(u8 dat) u8 i;
TSM_SDA_OUT(); TSM_SCL_L; for(i=0; i<8; i++ ) if(dat & 0x80) TSM_SDA_H; else TSM_SDA_L; TSM_SCL_H;/* TSM_SCL_L; delayus(1); dat <<= 1; TSM_SDA_H; TSM_SCL_H; /*----------------------------------------------------------------------------- ------------------------------------------------------------------------------ static u8 I2C_ReadByte(void)
u8 i,temp = 0; TSM_SDA_IN();/* TSM_SCL_L;/* for(i= 0; i<8; i++) temp <<= 1; TSM_SCL_H; /* if(tsm_sda_read()) /* temp temp++; TSM_SCL_L; return temp; /* ----------------- Beautiful part line ------------------------------------- /*----------------------------------------------------------------------------- TSM12 writedata-- WriteAddr--
ErrorStatus ------------------------------------------------------------------------------ u8 TSM_Write_Byte(u8 WriteAddr,u8 WriteData) /* I2C_Start(); /* I2C_WriteByte(DEVICE_WRITE_ADDR); if(i2c_waitack()) return ERROR; /* I2C_WriteByte(WriteAddr); if(i2c_waitack()) return ERROR; /* I2C_WriteByte(WriteData); if(i2c_waitack()) return ERROR; /* I2C_Stop(); return SUCCESS; /* ---------------------------------------------------------------------------- GT216L writedata1 2-- WriteAddr-- ErrorStatus ------------------------------------------------------------------------------
u8 TSM_Write_2Byte(u8 WriteAddr, u8 WriteData1, u8 WriteData2) /* I2C_Start(); /* I2C_WriteByte(DEVICE_WRITE_ADDR); if(i2c_waitack()) return ERROR; /* I2C_WriteByte(WriteAddr); if(i2c_waitack()) return ERROR; /* 1 LSB I2C_WriteByte(WriteData1); if(i2c_waitack()) return ERROR; /* 2 MSB I2C_WriteByte(WriteData2); if(i2c_waitack()) return ERROR; /* I2C_Stop(); return SUCCESS; /******************************************************************************* * : TSM_ReadOneByte() * :
* : writeaddr-- * :, ERROR * : ****************************************************************************** u8 TSM_ReadOneByte(u8 writeaddr) u8 buffer = 0; /* I2C_Start(); /* I2C_WriteByte(DEVICE_WRITE_ADDR); if(i2c_waitack()) goto L_OUT; /* I2C_WriteByte(writeAddr); if(i2c_waitack()) goto L_OUT; /* I2C_Stop(); /* I2C_Start(); /* GT216L I2C_WriteByte(DEVICE_READ_ADDR); if(i2c_waitack()) goto L_OUT;
/* buffer = I2C_ReadByte(); I2C_SendAck(1); /* I2C_Stop(); return buffer; L_OUT: /* I2C_Stop(); return ERROR; /*----------------------------------------------------------------------------- writeaddr -- *butter -- length -- ErrorStatus ------------------------------------------------------------------------------ u8 TSM_ReadMutiBytes(u8 writeaddr, u8 *buffer, u8 length) u8 i; /*
I2C_Start(); /* I2C_WriteByte(DEVICE_WRITE_ADDR); if(i2c_waitack()) goto L_OUT; /* I2C_WriteByte(writeAddr); if(i2c_waitack()) goto L_OUT; /* I2C_Stop(); /* I2C_Start(); /* GT216L I2C_WriteByte(DEVICE_READ_ADDR); if(i2c_waitack()) goto L_OUT; /* for( i = 0; i<length; i++ ) buffer[i] = I2C_ReadByte(); if( i == (length-1) ) I2C_SendAck(1); NAck = 1 else I2C_SendAck(0); Ack = 0
/* I2C_Stop(); return SUCCESS; L_OUT: /* I2C_Stop(); return ERROR; /******************************************************************************* * : TSM12_Init() * : TSM12M * : * : * : ****************************************************************************** void TSM12_Init(void) u16 i; /* Power ON TSM_EN_L; delay_ms(100); wait for 100ms for(i = TIM_DLY_CNT; i>0; i--) delayus(100); /* H/W Reset, enable software reset TSM_Write_Byte(CTRL2, 0x0F);enable sleep mode
TSM_Write_Byte(CTRL2, 0x09);enable sleep mode delay_ms(200); /* Sensitivity setting,0x00 TSM_Write_Byte(SENS1, CH_SENS(3,3)); 9, 6 TSM_Write_Byte(SENS2, CH_SENS(3,3)); 3, # TSM_Write_Byte(SENS3, CH_SENS(3,3)); 8, 5 TSM_Write_Byte(SENS4, CH_SENS(3,3)); 2, 0 TSM_Write_Byte(SENS5, CH_SENS(3,3)); *, 1 TSM_Write_Byte(SENS6, CH_SENS(3,3)); 4, 7 /* General Control Register1 setting TSM_Write_Byte(CTRL1, 0x33); TSM_Write_2Byte(REF_RST1, 0x00, 0x00);renew value of everyone channel TSM_Write_2Byte(CH_HOLD1, 0x00, 0x00);enable all channels TSM_EN_H;TSM12 I2C disable reset off TSM_Write_Byte(CTRL2, 0x03);Normal mode, disable sleep mode /******************************************************************************* * : TSM12_Into_Sleep_Mode() * : TSM12M * :
* : * : ****************************************************************************** void TSM12_Into_Sleep_Mode(void) u16 i; TSM_EN_H; TSM_EN_L for(i = TIM_DLY_CNT; i>0; i--) delayus(100); TSM_EN_L;i2c enable delay_ms(100); WaitByX10ms(10); for(i = TIM_DLY_CNT; i>0; i--) delayus(100); TSM_Write_Byte(CTRL2, 0x07); TSM_EN_H; /******************************************************************************* * : TSM12_Exit_Sleep_Mode() * : TSM12M * : * : * : ****************************************************************************** void TSM12_Exit_Sleep_Mode(void)
u16 i; TSM_EN_L;i2c enable for(i = TIM_DLY_CNT; i>0; i--) delayus(100); TSM_Write_Byte(CTRL2, 0x03); TSM_EN_H; /*******************************END OF FILE*********************************************** /******************************************************************************* * : TSM12.h * : * : 2013/10/21 * : TSM12-2013 11 20 STM8LR8T6 MSP430 ****************************************************************************** #ifndef TSM12_H #define TSM12_H #include "general.h" #include "HW_Config.h" #define DEVICE_WRITE_ADDR 0xD0
#define DEVICE_READ_ADDR 0xD1 /* a,b Ch_n CH_n-1 1. 0 ~ 7( ) 2. 9 ~ F( ) 2 1 #define CH_SENS(a,b) 0x##a##b #define TIM_DLY_CNT (u16)150, STM8L fsysclk = 8MHZ #define TIM_DLY_CNT (u16)100 fsystclk = 4MHZ #if 1 function pins define #define TSM_GPIO_PORT #define TSM_SDA_PIN #define TSM_SCL_PIN #define TSM_EN_PIN GPIOF GPIO_Pin_5 GPIO_Pin_6 GPIO_Pin_4 #define TSM_INT_GPIO_PORT GPIOE #define TSM_INT_PIN GPIO_Pin_2 #define TSM_EXTI_INT_PIN EXTI_Pin_2 #else #define TSM_GPIO_PORT #define TSM_SDA_PIN #define TSM_SCL_PIN #define TSM_EN_PIN GPIOE GPIO_Pin_1 GPIO_Pin_0 GPIO_Pin_3 #define TSM_INT_GPIO_PORT GPIOE
#define TSM_INT_PIN GPIO_Pin_2 #define TSM_EXTI_INT_PIN EXTI_Pin_2 #endif #define TSM_SDA_OUT() TSM_GPIO_PORT->DDR = TSM_SDA_PIN output mode #define TSM_SDA_IN() GPIO_Init(TSM_GPIO_PORT, TSM_SDA_PIN, GPIO_Mode_In_FL_No_IT) #define TSM_SDA_H #define TSM_SDA_L TSM_GPIO_PORT->ODR = TSM_SDA_PIN TSM_GPIO_PORT->ODR &= ~TSM_SDA_PIN #define TSM_SCL_H #define TSM_SCL_L TSM_GPIO_PORT->ODR = TSM_SCL_PIN TSM_GPIO_PORT->ODR &= ~TSM_SCL_PIN #define TSM_EN_H #define TSM_EN_L TSM_GPIO_PORT->ODR = TSM_EN_PIN TSM_GPIO_PORT->ODR &= ~TSM_EN_PIN #define TSM_SDA_READ() GPIO_ReadInputDataBit(TSM_GPIO_PORT, TSM_SDA_PIN) SDA msp430 #define TSM_SDA_DIR P1DIR #define TSM_SDA_REG_OUT P1OUT #define TSM_SDA_REG_IN P1IN #define TSM_SDA_IE #define TSM_SDA_SEL #define TSM_SDA_PIN P1IE P1SEL BIT1 #define TSM_SCL_DIR #define TSM_SCL_OUT #define TSM_SCL_IE #define TSM_SCL_SEL #define TSM_SCL_PIN P1DIR P1OUT P1IE P1SEL BIT0 #define TSM_EN_DIR P8DIR
#define TSM_EN_OUT #define TSM_EN_IE #define TSM_EN_SEL #define TSM_EN_PIN P8OUT P8IE P8SEL BIT2 #define TSM_INT_DIR #define TSM_INT_OUT #define TSM_INT_IN #define TSM_INT_IE #define TSM_INT_IES #define TSM_INT_SEL #define TSM_INT_PIN P1DIR P1OUT P1IN P1IE P1IES P1SEL BIT2 #define TSM_SDA_OUT() TSM_SDA_DIR = TSM_SDA_PIN output mode #define TSM_SDA_IN() TSM_SDA_DIR &= ~TSM_SDA_PIN #define TSM_SDA_H #define TSM_SDA_L TSM_SDA_REG_OUT = TSM_SDA_PIN TSM_SDA_REG_OUT &= ~TSM_SDA_PIN #define TSM_SCL_H #define TSM_SCL_L TSM_SCL_OUT = TSM_SCL_PIN TSM_SCL_OUT &= ~TSM_SCL_PIN #define TSM_EN_H #define TSM_EN_L TSM_EN_OUT = TSM_EN_PIN TSM_EN_OUT &= ~TSM_EN_PIN #define TSM12_I2C_ON() TSM_EN_L #define TSM_SDA_READ() GPIO_ReadInputDataBit(TSM_GPIO_PORT, TSM_SDA_PIN) SDA #define TSM_SDA_READ() ((TSM_SDA_REG_IN & TSM_SDA_PIN) >> 1) /* TSM12M Register Map typedef enum
SENS1 = 0x02, Sensitivity, Channel 2 and 1 SENS2 = 0x03, Channel 4 and 3 SENS3 = 0x04, Channel 6 and 5 SENS4 = 0x05, Channel 8 and 7 SENS5 = 0x06, Channel 10 and 9 SENS6 = 0x07, Channel 12 and 11 CTRL1 = 0x08, CTRL2 = 0x09, REF_RST1 = 0x0A, REF_RST2 = 0x0B, CH_HOLD1 = 0x0C, CH_HOLD2 = 0x0D, CAL_HOLD1 = 0x0E, CAL_HOLD2 = 0x0F, OUTPUT1 = 0x10, OUTPUT2 = 0x11, OUTPUT3 = 0x12, TSM_RegMapAddr_TypeDef; /* External varialbles ------------------------------------------------------- extern u8 fg_tsm_int; /* External functions -------------------------------------------------------- extern void TSM12_IO_Init(void); extern void TSM12_Init(void); extern u8 TSM_ReadOneByte(u8 writeaddr); extern u8 TSM_ReadMutiBytes(u8 writeaddr, u8 *buffer, u8 length); extern void TSM12_Into_Sleep_Mode(void); extern void TSM12_Exit_Sleep_Mode(void); #endif
/*------------------------------------END OF FILE-----------------------------