FX3/CX3 模拟i2c

来源:互联网 发布:java人事工资管理系统 编辑:程序博客网 时间:2024/06/06 02:52
void delay(uint32_t t){    while(--t);//CyU3PBusyWait (t);}CyU3PReturnStatus_tIIC_Set_SDA(CyBool_t isHigh){    CyU3PReturnStatus_t status;    status = CyU3PGpioSetValue (FX3_I2C_SDA, isHigh);    return status;}CyU3PReturnStatus_t IIC_Set_SCK(CyBool_t isHigh){    CyU3PReturnStatus_t status;    status = CyU3PGpioSetValue (FX3_I2C_SCK, isHigh);    return status;}CyBool_t IIC_Read_SDA(void){    CyBool_t temp = CyFalse;    CyU3PGpioGetValue (FX3_I2C_SDA, &temp);    return temp;}void SDA_OUT(CyBool_t outValue){    CyU3PReturnStatus_t status;    CyU3PGpioSimpleConfig_t gpioConfig;    gpioConfig.outValue    = outValue;//CyFalse;//0    gpioConfig.inputEn     = CyFalse;    gpioConfig.driveLowEn  = CyTrue;    gpioConfig.driveHighEn = CyTrue;    gpioConfig.intrMode    = CY_U3P_GPIO_NO_INTR;    status = CyU3PGpioSetSimpleConfig(FX3_I2C_SDA, &gpioConfig);    if (status != CY_U3P_SUCCESS)    {        CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig for GPIO Id %d failed, error code = %d\n",                FX3_I2C_SDA, status);    }}void SDA_IN(void){    CyU3PReturnStatus_t status;    CyU3PGpioSimpleConfig_t gpioConfig;    /* Configure GPIO I2C_SDA as input */    gpioConfig.outValue    = CyFalse;    gpioConfig.inputEn     = CyTrue;    gpioConfig.driveLowEn  = CyFalse;    gpioConfig.driveHighEn = CyFalse;    gpioConfig.intrMode    = CY_U3P_GPIO_NO_INTR;    status = CyU3PGpioSetSimpleConfig(FX3_I2C_SDA, &gpioConfig);    if (status != CY_U3P_SUCCESS)    {        CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig for GPIO Id %d failed, error code = %d\n",                FX3_I2C_SDA, status);    }}////////////////////////////////////////////////void IIC_Start(void){    SDA_OUT(1);    IIC_Set_SDA(1);    IIC_Set_SCK(1);    delay(100);    IIC_Set_SDA(0);    delay(100);    IIC_Set_SCK(0);}void IIC_Stop(void){    SDA_OUT(0);    IIC_Set_SCK(0);    IIC_Set_SDA(0);    delay(100);    IIC_Set_SCK(1);    IIC_Set_SDA(1);    delay(100);}uint8_t IIC_Wait_Ack(void){    uint8_t ucErrTime=0;    SDA_IN();    IIC_Set_SDA(1);delay(25);    IIC_Set_SCK(1);delay(25);    while(IIC_Read_SDA())    {        ucErrTime++;        delay(25);        if(ucErrTime > 100)//250        {            IIC_Stop();            return 0;        }    }    IIC_Set_SCK(0);    return 1;}void IIC_Ack(void){    IIC_Set_SCK(0);    SDA_OUT(0);    IIC_Set_SDA(0);    delay(50);    IIC_Set_SCK(1);    delay(50);    IIC_Set_SCK(0);}void IIC_NAck(void){    IIC_Set_SCK(0);    SDA_OUT(1);    IIC_Set_SDA(1);    delay(50);    IIC_Set_SCK(1);    delay(50);    IIC_Set_SCK(0);}void IIC_Send_Byte(uint8_t txd){    uint8_t i;    SDA_OUT(0);//TODO    IIC_Set_SCK(0);    for(i=0;i<8;i++)    {        CyU3PGpioSetValue (FX3_I2C_SDA, (txd&0x80)>>7);    //    if((txd&0x80)>>7)         IIC_Set_SDA(1);    //    else          IIC_Set_SDA(0);        txd<<=1;        IIC_Set_SCK(1);        delay(50);        IIC_Set_SCK(0);        delay(50);    }}uint8_t IIC_Read_Byte(unsigned char ack){    uint8_t i,receive=0;    SDA_IN();    for(i=0;i<8;i++ )    {        IIC_Set_SCK(0);        delay(50);        IIC_Set_SCK(1);        receive<<=1;        if(IIC_Read_SDA()) receive++;        delay(25);    }    if (!ack)        IIC_NAck();    else        IIC_Ack();    return receive;}
原创粉丝点击