資源簡介
max4409光照檢測stm32作為主控,只需將本代碼代替原子iic程序即可

代碼片段和文件信息
#include?“myiic.h“
#include?“delay.h“
//初始化IIC
void?IIC_Init(void)
{ ?????
GPIO_InitTypeDef?GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB?ENABLE?); //使能GPIOB時鐘
???
GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_Out_PP?;???//推挽輸出
GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_50MHz;
GPIO_Init(GPIOB?&GPIO_InitStructure);
GPIO_SetBits(GPIOBGPIO_Pin_6|GPIO_Pin_7);? //PB6PB7?輸出高
}
//產生IIC起始信號
void?IIC_Start(void)
{
SDA_OUT();?????//sda線輸出
IIC_SDA=1; ?? ??
IIC_SCL=1;
delay_us(4);
? IIC_SDA=0;//START:when?CLK?is?highDATA?change?form?high?to?low?
delay_us(4);
IIC_SCL=0;//鉗住I2C總線,準備發送或接收數據?
} ??
//產生IIC停止信號
void?IIC_Stop(void)
{
// SDA_OUT();//sda線輸出
// IIC_SCL=0;
// IIC_SDA=0;//STOP:when?CLK?is?high?DATA?change?form?low?to?high
//? delay_us(4);
// IIC_SCL=1;?
// IIC_SDA=1;//發送I2C總線結束信號
// delay_us(4);
SDA_OUT();//sda線輸出
IIC_SDA=0;
? IIC_SCL=1;
delay_us(4);
IIC_SDA=1;//發送I2C總線結束信號
delay_us(4);
}
//等待應答信號到來
//返回值:1,接收應答失敗
//????????0,接收應答成功
u8?IIC_Wait_Ack(void)
{
u8?ucErrTime=0;
SDA_IN();??????//SDA設置為輸入??
IIC_SDA=1;delay_us(2); ???
IIC_SCL=1;delay_us(2); ?
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return?1;
}
}
IIC_SCL=0;//時鐘輸出0? ???
return?0;??
}?
//產生ACK應答
void?IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不產生ACK應答 ????
void?IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
} ? ?????
//IIC發送一個字節
//返回從機有無應答
//1,有應答
//0,無應答 ??
void?IIC_Send_Byte(u8?txd)
{????????????????????????
????u8?t;???
SDA_OUT();? ????
????IIC_SCL=0;//拉低時鐘開始數據傳輸
????for(t=0;t<8;t++)
????{??????????????
????????//IIC_SDA=(txd&0x80)>>7;
if((txd&0x80)>>7)
IIC_SDA=1;
else
IIC_SDA=0;
txd<<=1;? ??
delay_us(2);???//對TEA5767這三個延時都是必須的
IIC_SCL=1;
delay_us(2);?
IIC_SCL=0;
delay_us(2);
????} ?
}? ????
//讀1個字節,ack=1時,發送ACK,ack=0,發送nACK???
u8?IIC_Read_Byte(unsigned?char?ack)
{
unsigned?char?ireceive=0;
SDA_IN();//SDA設置為輸入
????for(i=0;i<8;i++?)
{
????????IIC_SCL=0;?
????????delay_us(2);
IIC_SCL=1;
????????receive<<=1;
????????if(READ_SDA)receive++;???
delay_us(1);?
????} ?
????if?(!ack)
????????IIC_NAck();//發送nACK
????else
????????IIC_Ack();?//發送ACK???
????return?receive;
}
/*---------------------------------------------------------------------
?功能描述:?寫MAX44009
?參數說明:?REG_Address?-?寄存器地址
?函數返回:?無
?---------------------------------------------------------------------*/
void?B_LUX_Single_Write(u8?REG_Address?u8?REG_data)
{?
??IIC_Start();????????????????????????????????????????//起始信號
??IIC_Send_Byte(B_LUX_SlaveAddress);???????????????????//發送設備地址+寫信號
IIC_Wait_Ack();
??IIC_Send_Byte(REG_Address);??????????????????????????//內部寄存器地址,請參考中文pdf22頁?
IIC
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????8367??2018-12-10?18:31??MAX44009-STM32F1\myiic.c
?????文件???????1653??2018-12-10?18:32??MAX44009-STM32F1\myiic.h
?????目錄??????????0??2018-12-10?18:33??MAX44009-STM32F1
-----------?---------??----------?-----??----
????????????????10020????????????????????3
評論
共有 條評論