本程序使用的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;
}