久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
stm32模擬IIC代碼(有注釋)
[打印本頁]
作者:
hu_junbo
時間:
2018-12-11 16:15
標題:
stm32模擬IIC代碼(有注釋)
stm32模擬IIC功能實現通信,代碼有注釋
單片機源程序如下:
#include "IIC.h"
#include "Delay.h"
//初始化IIC
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//RCC->APB2ENR|=1<<4;//先使能外設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;
}
//產生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總線,準備發送或接收數據
}
//產生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;//發送I2C總線結束信號
//Delay_us(4);// hu cut
}
//等待應答信號到來
//返回值:1,接收應答失敗
// 0,接收應答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
//IIC_SDA=0;Delay_us(1);//hu add
SDA_IN(); //SDA設置為輸入
//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;
}
//產生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;
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(void)
{
u8 i,receive=0x00;
SDA_IN();//SDA設置為輸入
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, 下載次數: 73)
2018-12-11 16:14 上傳
點擊文件名下載附件
IIC源碼
下載積分: 黑幣 -5
作者:
hujj
時間:
2018-12-12 13:02
找了很久這類代碼,正好前天找到,抄錄到自己的項目中,昨天修改編譯通過,還沒有測試,和樓主的代碼高度一致。
作者:
hujj
時間:
2018-12-12 18:53
我有一點不明白,為什么PB7(IIC_SDA)要分別設置成輸入模式和輸出模式,應用過程中來回切換,而不用復用模式。希望大佬給科普一下,謝謝!
作者:
沒尾巴
時間:
2018-12-12 20:30
hujj 發表于 2018-12-12 18:53
我有一點不明白,為什么PB7(IIC_SDA)要分別設置成輸入模式和輸出模式,應用過程中來回切換,而不用復用模 ...
輸入輸出是為了發送和接收數據,而復用模式是管腳使用該管腳的相應外設功能
作者:
hujj
時間:
2018-12-13 13:16
謝謝樓主熱心解答,但我還是不太明白,是不是作GPIO時就應該分別設置成輸入和輸出模式,如果是使用引腳的其他功能時則應設置成復用模式?
不好意思,有點歪樓了,抱歉!
作者:
lidylee
時間:
2020-3-19 16:47
不知道為什么推挽輸出是od
作者:
nihao12345678
時間:
2020-3-19 20:32
感謝樓主分享
作者:
hghvhgv
時間:
2020-3-20 10:41
應該要設置成復用功能吧
作者:
billaj
時間:
2020-3-20 14:04
非常謝謝分享,在下新手,我能不能貪心點問一下,STM32能不能模擬IIS的??
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品真实国产乱文在线
|
久久久国产一区二区三区
|
亚洲精品久久久久久久久久久
|
国产精品二区三区在线观看
|
国产亚洲一级
|
国产精品久久九九
|
日本久久一区二区三区
|
日本一区二区电影
|
国产美女在线精品免费
|
日韩精品一区二区三区在线观看
|
亚洲精品视频在线播放
|
日本精品一区二区三区视频
|
欧美日韩免费一区二区三区
|
亚洲国产一区二区三区,
|
国产91久久久久
|
亚洲午夜一区二区
|
国产成人福利
|
一级a性色生活片久久毛片波多野
|
精品视频在线观看
|
国产在线一区二区三区
|
亚洲精品2区
|
久久丝袜视频
|
成人免费激情视频
|
国产精品久久久久久久久免费
|
91亚洲精
|
91视频官网
|
亚洲三级在线观看
|
国产中的精品av涩差av
|
久久久久91
|
欧美日韩国产精品一区
|
亚洲精品99
|
xxx国产精品视频
|
欧州一区二区
|
亚洲久视频
|
日韩欧美久久
|
男人天堂网站
|
亚洲国产一
|
久久99深爱久久99精品
|
国产高清久久
|
亚洲视频 欧美视频
|
中文字幕二区三区
|