#include "stm32f10x.h"
#include "pca9555.h"
#include "usart.h"
#include "timer2.h"
#include "wdg.h"
#define SCL GPIO_Pin_6
#define SDA GPIO_Pin_7
#define SCL_LED GPIO_Pin_10
#define SDA_LED GPIO_Pin_11
#define IIC_BIT_DELAY 5
#define DELAY delay(100)
// 定义PCA9555(NXP半导体I/O扩展芯片,I2C接口)
#define PCA9555_SLA (0x40 >> 1) // 定义PAC9555的器件地址
#define PCA9555_REG_IN0 0x00 // 定义输入寄存器0地址
#define PCA9555_REG_IN1 0x01 // 定义输入寄存器1地址
#define PCA9555_REG_OUT0 0x02 // 定义输出寄存器0地址
#define PCA9555_REG_OUT1 0x03 // 定义输出寄存器1地址
#define PCA9555_REG_POL0 0x04 // 定义极性反转寄存器0地址
#define PCA9555_REG_POL1 0x05 // 定义极性反转寄存器1地址
#define PCA9555_REG_CFG0 0x06 // 定义方向配置寄存器0地址
#define PCA9555_REG_CFG1 0x07 // 定义方向配置寄存器1地址
#define PCA9555_DEVICE_ADDR 0x40 // 定义PCA9555地址
#define LOOP_COUNT 10000
u8 pro0=0xff,pro1=0xff,pro2=0xff,pro3=0xff,PCA9555_dengban_ADDR,PCA9555_zkb_ADDR;
u8 value_keep0_l,value_keep0_h,value_keep1_l,value_keep1_h,value_keep2_l,value_keep2_h;
u8 parameters;
u16 led_buf[5];
u8 value_feedback0[2],value_feedback1[2],value_feedback2[2];
u16 auto_off_time_count;
u16 auto_open_off_time_count[16];
u16 auto_close_off_time_count[16];
u8 doorstate[16];
u8 powerstate[8];
u8 Refresh_Led=0;
u8 Refresh_Power=0;
/*// 定义全局变量
static unsigned long I2CM_BASE = I2C0_MASTER_BASE; // 定义I2C主机基址,并初始化
static tI2CM_DEVICE gtDevice; // 器件数据接口
static unsigned short gusStatus = STAT_IDLE; // 工作状态
//static tBoolean gbSendRecv; // 收发操作标志,false发送,true接收
static char gcAddr[4]; // 数据地址数组
static unsigned short gusAddrIndex; // 数据地址数组索引变量
static unsigned short gusDataIndex; // 数据缓冲区索引变量
*/
void delay(u32 conut)
{
while(conut -- > 0);
}
void IIC_SDA_DIR_SET(u8 io_dir) //SDA引脚输入输出设置
{
GPIO_InitTypeDef GPIO_InitStructure;
if(io_dir==0)
{
GPIO_InitStructure.GPIO_Pin = SDA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//output
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
else if(io_dir==1)
{
GPIO_InitStructure.GPIO_Pin = SDA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//input pull_up
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
}
void IIC_SDA_DIR_SET_LED(u8 io_dir) //SDA_LED引脚输入输出设置
{
GPIO_InitTypeDef GPIO_InitStructure;
if(io_dir==0)
{
GPIO_InitStructure.GPIO_Pin = SDA_LED;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//output
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
else if(io_dir==1)
{
GPIO_InitStructure.GPIO_Pin = SDA_LED;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//input pull_up
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
}
void IIC_Ready(void)
{
GPIO_SetBits(GPIOB,SCL);
DELAY;
GPIO_SetBits(GPIOB,SDA);
DELAY;
}
void IIC_PORT_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = SCL|SDA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
IIC_Ready();
}
void IIC_Start(void)
{
GPIO_SetBits(GPIOB,SDA);
DELAY;
GPIO_SetBits(GPIOB,SCL);
DELAY;
GPIO_ResetBits(GPIOB, SDA);
DELAY;
}
void IIC_Stop(void)
{
GPIO_ResetBits(GPIOB, SDA);
DELAY;
GPIO_SetBits(GPIOB,SCL);
DELAY;
GPIO_SetBits(GPIOB,SDA);
DELAY;
}
void IIC_Ack(void)
{
u16 i;
GPIO_SetBits(GPIOB,SCL);
DELAY;
IIC_SDA_DIR_SET(1);
while(GPIO_ReadInputDataBit(GPIOB,SDA)&&(i<0x2b0)) {i++;}
IIC_SDA_DIR_SET(0);
GPIO_ResetBits(GPIOB,SCL);
DELAY;
}
void IIC_Send_Ack(void)
{
GPIO_ResetBits(GPIOB,SDA);
DELAY;
GPIO_SetBits(GPIOB,SCL);
DELAY;
GPIO_ResetBits(GPIOB,SCL);
DELAY;
}
void IIC_Send_NoAck(void)
{
GPIO_SetBits(GPIOB,SDA);
DELAY;
GPIO_SetBits(GPIOB,SCL);
DELAY;
GPIO_ResetBits(GPIOB,SCL);
DELAY;
}
void IIC_Write_Byte(u8 a)
{
u16 i;
GPIO_ResetBits(GPIOB,SCL); //scl=0;
DELAY;
for(i=0;i<8;i++)
{
if(a&0x80)
GPIO_SetBits(GPIOB,SDA);//sda=1;
else
GPIO_ResetBits(GPIOB,SDA);
a=a<<1;
GPIO_SetBits(GPIOB,SCL);//scl=1;
DELAY;
GPIO_ResetBits(GPIOB,SCL);//scl=0;
DELAY;
}
GPIO_SetBits(GPIOB,SDA);//sda=1;
DELAY;
}
u8 IIC_Read_Byte(void)
{
u8 i,temp;
temp=0;
GPIO_SetBits(GPIOB,SDA);//sda=1;
DELAY;
GPIO_ResetBits(GPIOB,SCL); //scl=0;
DELAY;
IIC_SDA_DIR_SET(1);
for(i=0;i<8;i++)
{
GPIO_SetBits(GPIOB,SCL); //scl=1;
DELAY;
DELAY;
temp=(temp<<1)|GPIO_ReadInputDataBit(GPIOB,SDA);
DELAY;
GPIO_ResetBits(GPIOB,SCL); //scl=0;
DELAY;
}
IIC_SDA_DIR_SET(0);
GPIO_SetBits(GPIOB,SDA);//sda=1;
DELAY;
//GPIO_ResetBits(GPIOB,SCL);//scl=0;
//DELAY;
return temp;
}
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void IIC_Ready_LED(void)
{
GPIO_SetBits(GPIOB,SCL_LED);
DELAY;
GPIO_SetBits(GPIOB,SDA_LED);
DELAY;
}
void IIC_PORT_INIT_LED(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = SCL_LED|SDA_LED;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
IIC_Ready_LED();
}
void IIC_Start_LED(void)
{
GPIO_SetBits(GPIOB,SDA_LED);
DELAY;
GPIO_SetBits(GPIOB,SCL_LED);
DELAY;
GPIO_ResetBits(GPIOB, SDA_LED);
DELAY;
}
void IIC_Stop_LED(void)
{
GPIO_ResetBits(GPIOB, SDA_LED);
DELAY;
GPIO_SetBits(GPIOB,SCL_LED);
DELAY;
GPIO_SetBits(GPIOB,SDA_LED);
DELAY;
}
void IIC_Ack_LED(void)
{
u16 i;
GPIO_SetBits(GPIOB,SCL_LED);
DELAY;
IIC_SDA_DIR_SET_LED(1);
while(GPIO_ReadInputDataBit(GPIOB,SDA_LED)&&(i<0x2b0)) {i++;}
IIC_SDA_DIR_SET_LED(0);
GPIO_ResetBits(GPIOB,SCL_LED);
DELAY;
}
void IIC_Send_Ack_LED(void)
{
GPIO_ResetBits(GPIOB,SDA_LED);
DELAY;
GPIO_SetBits(GPIOB,SCL_LED);
DELAY;
GPIO_ResetBits(GPIOB,SCL_LED);
DELAY;
}
void IIC_Send_NoAck_LED(void)
{
GPIO_SetBits(GPIOB,SDA_LED);
DELAY;
GPIO_SetBits(GPIOB,SCL_LED);
DELAY;
GPIO_ResetBits(GPIOB,SCL_LED);
DELAY;
}
void IIC_Write_Byte_LED(u8 a)
{
u16 i;
GPIO_ResetBits(GPIOB,SCL_LED); //scl=0;
DELAY;
for(i=0;i<8;i++)
{
if(a&0x80)
GPIO_SetBits(GPIOB,SDA_LED);//sda=1;
else
GPIO_ResetBits(GPIOB,SDA_LED);
a=a<<1;
GPIO_SetBits(GPIOB,SCL_LED);//scl=1;
DELAY;
GPIO_ResetBits(GPIOB,SCL_LED);//scl=0;
DELAY;
}
GPIO_SetBits(GPIOB,SDA_LED);//sda=1;
DELAY;
}
u8 IIC_Read_Byte_LED(void)
{
u8 i,temp;
temp=0;
GPIO_SetBits(GPIOB,SDA_LED);//sda=1;
DELAY;
GPIO_ResetBits(GPIOB,SCL_LED); //scl=0;
DELAY;
IIC_SDA_DIR_SET_LED(1);
for(i=0;i<8;i++)
{
GPIO_SetBits(GPIOB,SCL_LED); //scl=1;
DELAY;
DELAY;
temp=(temp<<1)|GPIO_ReadInputDataBit(GPIOB,SDA_LED);
DELAY;
GPIO_ResetBits(GPIOB,SCL_LED); //scl=0;
DELAY;
}
IIC_SDA_DIR_SET_LED(0);
GPIO_SetBits(GPIOB,SDA_LED);//sda=1;
DELAY;
评论5