欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
stm32模擬IIC代碼(有注釋)
[打印本頁]
作者:
hu_junbo
時間:
2018-12-11 16:15
標題:
stm32模擬IIC代碼(有注釋)
stm32模擬IIC功能實現(xiàn)通信,代碼有注釋
單片機源程序如下:
#include "IIC.h"
#include "Delay.h"
//初始化IIC
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//RCC->APB2ENR|=1<<4;//先使能外設(shè)IO PORTC時鐘
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
IIC_SCL=1;
IIC_SDA=1;
}
//產(chǎn)生IIC起始信號
void IIC_Start(void)
{
SDA_OUT(); //sda線輸出
IIC_SDA=1;
IIC_SCL=1;
Delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
Delay_us(4);
IIC_SCL=0;//鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
}
//產(chǎn)生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;
Delay_us(4); //hu add
IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號
//Delay_us(4);// hu cut
}
//等待應(yīng)答信號到來
//返回值:1,接收應(yīng)答失敗
// 0,接收應(yīng)答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
//IIC_SDA=0;Delay_us(1);//hu add
SDA_IN(); //SDA設(shè)置為輸入
//IIC_SDA=1;Delay_us(1);//hu cut
IIC_SCL=1;Delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//時鐘輸出0
return 0;
}
//產(chǎn)生ACK應(yīng)答
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
Delay_us(2);
IIC_SCL=1;
Delay_us(2);
IIC_SCL=0;
}
//不產(chǎn)生ACK應(yīng)答
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發(fā)送一個字節(jié)
//返回從機有無應(yīng)答
//1,有應(yīng)答
//0,無應(yīng)答
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//拉低時鐘開始數(shù)據(jù)傳輸
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
Delay_us(2); //對TEA5767這三個延時都是必須的
IIC_SCL=1;
Delay_us(2);
IIC_SCL=0;
Delay_us(2);
}
}
//讀1個字節(jié),ack=1時,發(fā)送ACK,ack=0,發(fā)送nACK
u8 IIC_Read_Byte(void)
{
u8 i,receive=0x00;
SDA_IN();//SDA設(shè)置為輸入
for(i=0;i<8;i++ )
{
IIC_SCL=0;
Delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)
receive|= 0x01;
Delay_us(1);
}
return receive;
}
//IIC 往指定地址Address里寫Data
void IIC_Write_Addr_Data(u8 address,u8 data)
{
u8 w_addr,w_data;
w_addr = address;
w_data = data;
IIC_Start();
IIC_Send_Byte(0x00);
IIC_Wait_Ack();
IIC_Send_Byte(w_addr);
IIC_Ack();
IIC_Send_Byte(w_data);
IIC_Ack();
IIC_Stop();
Delay_us(4);
}
//IIC 讀指定地址Address里寫Data
u8 IIC_Read_Addr_Data(u8 address)
{
u8 r_addr,data=0x00;
r_addr = address;;
IIC_Start();
IIC_Send_Byte(0x00);
IIC_Wait_Ack();
IIC_Send_Byte(r_addr);
IIC_Ack();
IIC_Start();
IIC_Send_Byte(0x01);
IIC_Wait_Ack();
data = IIC_Read_Byte();
IIC_NAck();
IIC_Stop();
Delay_us(4);
return data;
}
復制代碼
所有資料51hei提供下載:
IIC.zip
(1.72 KB, 下載次數(shù): 73)
2018-12-11 16:14 上傳
點擊文件名下載附件
IIC源碼
下載積分: 黑幣 -5
作者:
hujj
時間:
2018-12-12 13:02
找了很久這類代碼,正好前天找到,抄錄到自己的項目中,昨天修改編譯通過,還沒有測試,和樓主的代碼高度一致。
作者:
hujj
時間:
2018-12-12 18:53
我有一點不明白,為什么PB7(IIC_SDA)要分別設(shè)置成輸入模式和輸出模式,應(yīng)用過程中來回切換,而不用復用模式。希望大佬給科普一下,謝謝!
作者:
沒尾巴
時間:
2018-12-12 20:30
hujj 發(fā)表于 2018-12-12 18:53
我有一點不明白,為什么PB7(IIC_SDA)要分別設(shè)置成輸入模式和輸出模式,應(yīng)用過程中來回切換,而不用復用模 ...
輸入輸出是為了發(fā)送和接收數(shù)據(jù),而復用模式是管腳使用該管腳的相應(yīng)外設(shè)功能
作者:
hujj
時間:
2018-12-13 13:16
謝謝樓主熱心解答,但我還是不太明白,是不是作GPIO時就應(yīng)該分別設(shè)置成輸入和輸出模式,如果是使用引腳的其他功能時則應(yīng)設(shè)置成復用模式?
不好意思,有點歪樓了,抱歉!
作者:
lidylee
時間:
2020-3-19 16:47
不知道為什么推挽輸出是od
作者:
nihao12345678
時間:
2020-3-19 20:32
感謝樓主分享
作者:
hghvhgv
時間:
2020-3-20 10:41
應(yīng)該要設(shè)置成復用功能吧
作者:
billaj
時間:
2020-3-20 14:04
非常謝謝分享,在下新手,我能不能貪心點問一下,STM32能不能模擬IIS的??
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1