STM32软件IIC程序

本程序使用的IIC协议针对CDCE706,源码可转(IIC源码

#include "Smbus.h"
#include "delay.h"


void Start(void)
{
    SDA_OUT();  //Êý¾ÝÊä³ö
    CDCE_CLK = 1;
    CDCE_DATA = 1;
    delay_us(3);   
    CDCE_DATA = 0;
    delay_us(5);
    CDCE_CLK = 0;
	
    delay_us(5);

}


void Stop(void)
{
    SDA_OUT();
    CDCE_CLK = 0;
    CDCE_DATA = 0;
    delay_us(2);
    CDCE_CLK = 1;
    delay_us(5);
    CDCE_DATA = 1;
	delay_us(1);

}


u8 Wait_Ack(void)
{
	//CDCE_DATA = 0;
	SDA_IN(); 
    u8 ucErrTime=0;
	
	//CDCE_CLK = 0;
         
   //delay_us(1);//??
    CDCE_CLK = 1;
    //delay_us(1);
    while(READ_SDA)
    {
		
        ucErrTime++;
        if(ucErrTime>10)
        {
			
            Stop();
			//printf("\n\r22\n\r");
            return 1;
        }
		delay_us(1);

    }
    return 0;
}


void Do_Ack(void)
{   
    CDCE_CLK = 0;
    SDA_OUT();
    CDCE_DATA = 0;
    delay_us(2);
    CDCE_CLK =1;
    delay_us(2);
    CDCE_CLK =0;

}

void Do_NAck(void)
{
    CDCE_CLK = 0;
    SDA_OUT();
    CDCE_DATA = 1;
    delay_us(2);
    CDCE_CLK =1;
    delay_us(2);
    CDCE_CLK =0;
	delay_us(1);

}



void Write_Byte(u8 data)
{   
	SDA_OUT();
    CDCE_CLK = 0;//ʱÖÓÀ­µÍ¿ªÊ¼´«Êä
	CDCE_DATA = 0;
	delay_us(2);
    
    for(u8 i=0;i<8;i++)  //MSB
    {
		if(data&0x80)
			CDCE_DATA = 1;
		else
			CDCE_DATA = 0;
       // CDCE_DATA = (data&0x80)>>7;
        data <<= 1;
        delay_us(2);//±ØÐëÑÓʱ
        CDCE_CLK = 1;
        delay_us(5); //±ØÐëÑÓʱ(4.7)
        CDCE_CLK = 0;
        delay_us(2);   
    }
    
}


u8 Read_Byte(u8 ack)
{
    u8 receive;
    SDA_IN();
    for(u8 i=0;i<8;i++)
    {
        CDCE_CLK =0;
        delay_us(2);
        CDCE_CLK =1;
        receive <<= 1;
        if(READ_SDA)
            receive++;
        delay_us(5);
    
    }
    if(ack)
        Do_NAck();
    else
        Do_Ack();
    return receive;
}


#include "cdce706.h"
#include "Smbus.h"
#include "cdce706.h"
#include "delay.h"
void CDCE_Init(void)
{
    GPIO_InitTypeDef GPIO_Init;
    
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    
    GPIO_Init.Pin = GPIO_PIN_4|GPIO_PIN_5;
    GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init.Pull = GPIO_NOPULL;
    GPIO_Init.Speed = GPIO_SPEED_FREQ_MEDIUM;
    HAL_GPIO_Init(GPIOA,&GPIO_Init);
    

    
    CDCE_CLK = 1;
    CDCE_DATA= 1;
    

}


void Cdce_Write_Byte(u8 offset,u8 data)
{
	offset |= 0X80;  //×Ö½ÚдÈë
    Start();
    Write_Byte(CDCE_ADDRESS_W);
    Wait_Ack();
    Write_Byte(offset);
    Wait_Ack();	
    Write_Byte(data);
    Wait_Ack();  
    Stop();
}


void Cdce_Write_Block(u8 offset,u8* dada,u8 Count)
{
	offset &= ~(0x80);  //¿éдÈë
    Start();
   
    Write_Byte(CDCE_ADDRESS_W);
    Wait_Ack();
    Write_Byte(offset);
    Wait_Ack();
    Write_Byte(Count);
    Wait_Ack();
    for(u8 i = 0;i<Count;i++)
    {
        Write_Byte(dada[i]);
        Wait_Ack();
		delay_us(1);
    }
    Stop();
}


u8 Cdce_Read_Byte(u8 offset,u8 ack)
{
	offset |= 0x80;
    u8 recive;
    Start();   
    Write_Byte(CDCE_ADDRESS_W);
    Wait_Ack();
    Write_Byte(offset);
    Wait_Ack();
    Start();
    Write_Byte(CDCE_ADDRESS_R);
    Wait_Ack();
    recive=Read_Byte(ack);
    Stop();
    return recive;      
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值