1. 程式人生 > >正點原子stm32模擬IIC

正點原子stm32模擬IIC

#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程式只供學習使用,未經作者許可,不得用於其它任何用途
//Mini STM32開發板
//IIC 驅動函式	   
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2010/6/10 
//版本:V1.0
//版權所有,盜版必究。
//Copyright(C) 正點原子 2009-2019
//All rights reserved
////////////////////////////////////////////////////////////////////////////////// 	  

   	   		   
//IO方向設定
#define SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}

//IO操作函式	 
#define IIC_SCL    PBout(9) //SCL
#define IIC_SDA    PBout(8) //SDA	 
#define READ_SDA   PBin(8)  //輸入SDA 

//IIC所有操作函式
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//傳送IIC開始訊號
void IIC_Stop(void);	  			//傳送IIC停止訊號
void IIC_Send_Byte(u8 txd);			//IIC傳送一個位元組
u8 IIC_Read_Byte(unsigned char ack);//IIC讀取一個位元組
u8 IIC_Wait_Ack(void); 				//IIC等待ACK訊號
void IIC_Ack(void);					//IIC傳送ACK訊號
void IIC_NAck(void);				//IIC不傳送ACK訊號

void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);	  
#endif

















#include "myiic.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程式只供學習使用,未經作者許可,不得用於其它任何用途
//Mini STM32開發板
//IIC 驅動函式	   
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2010/6/10 
//版本:V1.0
//版權所有,盜版必究。
//Copyright(C) 正點原子 2009-2019
//All rights reserved
////////////////////////////////////////////////////////////////////////////////// 	  

//初始化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_8|GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推輓輸出
	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; 
	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(1);	   
	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(unsigned char ack)
{
	unsigned char i,receive=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;
}




























相關推薦

正點原子stm32模擬IIC

#ifndef __MYIIC_H #define __MYIIC_H #include "sys.h" //////////////////////////////////////////////////////////////////////////////////

STM32(9) GPIO口複用功能實現(正點原子) QQ群860099671

一個GPIO口可以 複用成內部外設的功能引腳,這裡我們利用PA9\PA10設定為UART1來舉例。 IO口對應的複用功能需要查表來確定。這個表在晶片手冊 下面這個圖講解了GPIO口的複用原理 上圖右邊左圖是複用器(AFRL(31:0)、AFRH(31:0)),要

stm32 使用正點原子delay延時函式,主函式延時失效

最近在做一個東西時,發現一個現象。之前一直沒有發現過,或者發現也沒有仔細研究過,在此為大家分享。 在使用原子哥的延時函式時,發現主函式裡面的延時函式失效了。沒有起任何作用。下面簡單分析一個整個過程。 先直接上程式碼,很簡單的一個例項 int main(void) {

STM32軟體模擬IIC

                               IIC匯流排 一、與IIC有關的知識 (1)IIC屬於半雙工通訊方式 (2)IIC的協議     1.空閒狀態:IIC的SCL和SDA兩條線均處於高電平狀態,此時即釋放匯流排     2.起始訊號(Start):

STM32硬體IIC與51模擬IIC通訊

IIC介紹   IIC協議規定:SDA上傳輸的資料必須在SCL為高電平期間保持穩定,SDA上的資料只能在SCL為低電平期間變化。IIC期間在脈衝上升沿把資料放到SDA上,在脈衝下降沿從SAD上讀取資料。這樣的話,在SCL高電平期間,SDA上的資料是穩定的。在脈

手把手教你在STM32下移植UCGUI(基於正點原子的MINI開發板)

準備資料: 1、  到網上下載UCGUI3.90的原始碼,如果下不到,可以點選以下連結進行下載: 下載後解壓,可看到如下目錄:             Sample目錄主要包含一些示例程式碼,Start目錄包含工程檔案和原始碼,Tool包含一些取模工具,很實用。 開始移

STM32—基於模擬IIC方式讀取EEPROM

前言: 最近在除錯STM32L152晶片利用IIC介面讀取EEPROM的程式,總結下STM32的 IIC介面 讀取EEPROM的使用方法。 PS:由於STM32的硬體IIC存在一些問題,本文暫時使用模擬IIC進行EEPROM的讀取。STM32的硬體IIC使用方法見另外

stm32IIC通信協議

art code strong typedef col 上傳 bps eight 系統結構 1 //3?ê??ˉIIC 2 void IIC_Init(void) 3 { 4 GPIO_InitTy

2.14 正點原子ESP8266模塊的STA模式 調試3

重新 brush 0x0d 代碼 _cmd mode cif usm -s 1.重新了解了usart串口的代碼(這裏用usart1代碼為例) USART1_IRQHandler(串口1中斷函數代碼) if(USART_GetITStatus(USART1, USART_I

模擬IIC(轉載只為查閱方便,若侵權,立刪)

模擬IIC IIC 即Inter-Integrated Circuit(積體電路匯流排),這種匯流排型別是由飛利浦半導體公司在八十年代初設計出來的一種簡單、雙向、二線制、同步序列匯流排,主要是用來連線整體電路(ICS) ,IIC是一種多向控制匯流排,也就是說多個晶片可以連線到同一匯流排結構下,同

正點原子戰艦開發板---串列埠除錯(硬體除錯的一點經驗吧)

1、為什麼需要串列埠除錯? 因為自己在設計電路畫板子的時候,很多時候都要用到串列埠,比喻語音模組,藍芽模組等等。 2、硬體原理圖明明是對的,程式也改了,但是用串列埠printf效果就是不出來,應該怎麼辦? (1)在開發板上驗證程式碼,我這裡用的是正點原子戰艦的開發板,我程式中用的是串列埠

原子STM32例程,不用新增標頭檔案的原因是SYS.H

大家好,在新建工程的時候給新增進去的韌體庫檔案(我用的是mini開發板,例子是跑馬燈的),例如放在USER目錄下,放在CORE目錄下的檔案,為什麼到最後main函式裡面,只有SYSTEM目錄下的這三個檔案被包含進來的呢 677a2804c82647b459883b2c0fcd4363_894.

正點原子 24 NVIC中斷優先順序分組

數值越小,優先順序越高 高優先順序的搶佔優先順序是可以打斷正在進行的低搶佔優先順序中斷的。 搶佔優先順序相同的中斷,高響應優先順序不可以打斷低響應優先順序的中斷。 搶佔優先順序相同的中斷,當兩個中斷同時發生的情況下,哪個響應優先順序高,哪個先執行。 如果兩個中斷的搶佔優先順序和響應優先順序

正點原子 11 新建工程模板(暫存器)

1, 新建一個資料夾(11),用來存放工程的全部檔案 2,在資料夾 11 下再建CORE    FWLIB  OBJ  SYSTEM  USER 用來劃分不同型別的工程檔案 3,開啟Keil,點選Keil 的選單:Project –>New Uvision Project  

深入解讀微控制器IO口模擬IIC程式設計

在微控制器的開發過程中,經常會使用IIC介面連線外部感測器獲得相應的資料。一旦我們的IIC介面數目較多而微控制器固有的IIC介面不夠的情況,這時一個微控制器普通IO口模擬IIC的做法可以解決我們的尷尬。這篇部落格詳細的介紹STM32F103的IO口模擬IIC的詳細做法。

STM32F103微控制器軟體模擬IIC並讀取TMP112數字溫度感測器

本文利用STM32F103系列微控制器讀取TMP112數字溫度感測器的溫度資訊,TMP112數字感測器採用IIC匯流排協議通訊。STM32自身含有硬體IIC資源,分別是PB6-->SCL、PB7-->SDA,硬體IIC的操作在STM32開發板對應的資料上均有給出

正點原子stm32f103mini版串列埠下載BOOT0引腳與與CH340G晶片引腳RTS、DTR、的關係原理

        在做串列埠實驗時,一直搞不明白一鍵下載是怎麼回事,於是自己就去捉摸CH340G這塊晶片,那麼這裡我將詳細的講解一下這塊晶片怎麼與stm32配合使用的。1、由CH340G晶片資料可以知道這兩個引腳的功能都為輸出RTS#:訊號輸出,初始狀態為高電平,表示晶片接收資

正點原子STM32F407探索版接入機智雲LED控制教程

前言: 程式碼分享:https://github.com/nicedayzhu/ALIENTEK_STM32F407_Gizwits 正點原子官方提供了與機智雲連線的開發手冊,但是手冊內容中的Gizwits檔案目錄和目前的機智雲自動生成的程式碼目錄有一定的差異,因此移植過程有了一些改變。

相容正點原子 stm32f103 UTF8字元編碼轉換 GBK 編碼格式

最近想做一個 網路天氣的小東西.好容易寫好了驅動,GET 了一下天氣網站的 API 返回竟然是中文亂碼,猜測是 UTF8 亂碼,果不其然.於是就自己去尋找網上大神們的解決方案:一般是 UTF-8 -> Unicode ->GBK (中文) 關鍵字: stm32103 嵌入式 u

STM32軟體IIC的實現

接上篇,LIS331的例程終於可以正常運行了,接下來就是將其移植到STM32上了,不過第一次接觸STM32的IIC,看例程比較簡單,直接複製到工程後卻讀不出資料,一直停在等待從裝置回覆ACK的死迴圈。 經過一天的修改之後,終於還是捨去了硬體IIC改成了用軟體實現,最終程