(2)創建at24cxx.c文件,并輸入以下代碼。
/*********************************************************************************************************
EEPROM 驅 動 程 序
*********************************************************************************************************/
#include 'at24cxx.h'
#include 'delay.h'
/***************************************************
Name :IIC_Start
Function :IIC起始信號
Paramater :None
Return :None
***************************************************/
void IIC_Start()
{
GPIOB->CRL &= 0x0FFFFFFF ; //PB7推挽輸出
GPIOB->CRL |= 0x30000000 ;
IIC_SDA = 1 ;
IIC_SCL = 1 ;
delay_us( 4 ) ;
IIC_SDA = 0 ;
delay_us( 4 ) ;
IIC_SCL = 0 ;
}
/***************************************************
Name :IIC_Stop
Function :IIC停止信號
Paramater :None
Return :None
***************************************************/
void IIC_Stop()
{
GPIOB->CRL &= 0x0FFFFFFF ; //PB7推挽輸出
GPIOB->CRL |= 0x30000000 ;
IIC_SCL = 0 ;
IIC_SDA = 0 ;
delay_us( 4 ) ;
IIC_SCL = 1 ;
IIC_SDA = 1 ;
delay_us( 4 ) ;
}
/***************************************************
Name :IIC_Wait_Ack
Function :IIC等待應答
Paramater :None
Return :
0:成功
1:失敗
***************************************************/
void IIC_Wait_Ack()
{
u8 Time = 0 ;
GPIOB->CRL &= 0x0FFFFFFF ;
GPIOB->CRL |= 0x80000000 ;
IIC_SDA = 1 ;
delay_us( 1 ) ;
IIC_SCL = 1 ;
delay_us( 1 ) ;
while( IIC_SDA_READ )
{
Time ++ ;
if( Time>250 )
{
IIC_Stop() ;
break ;
}
}
IIC_SCL = 0 ;
}
/***************************************************
Name :IIC_Send_Byte
Function :IIC發送一個字節
Paramater :
ack:應答使能
0:不應答
1:應答
Return :None
***************************************************/
void IIC_Send_Byte( u8 Byte )
{
u8 i;
GPIOB->CRL &= 0x0FFFFFFF ; //PB7推挽輸出
GPIOB->CRL |= 0x30000000 ;
IIC_SCL = 0 ;
for( i=0; i<8; i++ )
{
if( ( Byte&0x80 )==0x80 )
IIC_SDA = 1 ;
else
IIC_SDA = 0 ;
Byte <<= 1 ;
delay_us( 2 ) ;
IIC_SCL = 1 ;
delay_us( 2 ) ;
IIC_SCL = 0 ;
delay_us( 2 ) ;
}
}
/***************************************************
Name :IIC_Read_Byte
Function :IIC讀取一個字節
Paramater :
ack:應答使能
0:不應答
1:應答
Return :None
***************************************************/
u8 IIC_Read_Byte( u8 Ack )
{
u8 i,Byte=0;
GPIOB->CRL &= 0x0FFFFFFF ;
GPIOB->CRL |= 0x80000000 ;
for( i=0; i<8; i++ )
{
IIC_SCL = 0 ;
delay_us( 2 ) ;
IIC_SCL = 1 ;
Byte <<= 1 ;
if( IIC_SDA_READ )
Byte |= 0x01 ;
delay_us( 1 ) ;
}
IIC_SCL = 0 ;
GPIOB->CRL &= 0x0FFFFFFF ; //PB7推挽輸出
GPIOB->CRL |= 0x30000000 ;
IIC_SDA = 1 - Ack ;
delay_us( 2 ) ;
IIC_SCL = 1 ;
delay_us( 2 ) ;
IIC_SCL = 0 ;
return Byte ;
}
/***************************************************
Name :AT24Cxx_Write_Data
Function :寫入1個數據
Paramater :
Address:地址
Data:數據
Return :讀到的數據
***************************************************/
void AT24Cxx_Write_Data( u16 Address, u8 Data )
{
IIC_Start() ;
IIC_Send_Byte( 0xA0|( Address/256 )<<1 ) ; //發送器件地址,寫數據
IIC_Wait_Ack() ;
IIC_Send_Byte( Address%256 ) ; //發送低地址
IIC_Wait_Ack() ;
IIC_Send_Byte( Data ) ; //發送字節
IIC_Wait_Ack() ;
IIC_Stop() ; //產生一個停止條件
delay_ms( 10 ) ; //EEPROM的寫入速度比較慢
}
/***************************************************
Name :AT24Cxx_Write_nData
Function :寫入n個數據
Paramater :
Address:地址
*Buffer:數據緩存
Len:數據長度
Return :None
***************************************************/
void AT24Cxx_Write_nData( u16 Address, u8 *Buffer, u16 Len )
{
u16 i ;
for( i=0; iAPB2ENR |= 1<<3 ; //先使能外設GPIOB時鐘
GPIOB->CRL &= 0x00FFFFFF ; //PB6和PB7推挽輸出
GPIOB->CRL |= 0x33000000 ;
GPIOB->ODR |= 3<<6 ; //PB6和PB7輸出高
while( AT24Cxx_Check()==0 ) ;
}
(3)創建1.c文件并輸入以下代碼。
#include 'sys.h'
#include 'delay.h'
#include 'usart1.h'
#include 'lcd.h'
#include 'at24cxx.h'
u8 TEXT_Buffer[] = 'STM32F103 IIC Test' ;
int main()
{
u8 datatemp[ 17 ] ;
STM32_Clock_Init( 9 ) ; //STM32時鐘初始化
SysTick_Init( 72 ) ; //SysTick初始化
USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200
LCD_Init() ; //LCD初始化
AT24Cxx_Init() ; //AT24C初始化
POINT_COLOR = RED ; //設置字體為紅色
AT24Cxx_Write_nData( 0, TEXT_Buffer, 18 ) ; //從第0個地址處開始寫入
AT24Cxx_Read_nData( 0, datatemp, 18 ) ; //從第0個地址處開始讀出
LCD_ShowString( 0, 0, datatemp ) ; //顯示讀到的字符串
while( 1 )
{
}
}
16.4.2 硬件IIC控制
注:由于STM32的硬件IIC總是容易卡死(這也是為什么網絡上幾乎沒有硬件IIC通訊的例子的原因),所以這里采用了ST內部提供的通訊機制來保證IIC的正常使用。
(1)創建at24cxx.h文件并輸入以下代碼。
復制
/*********************************************************************************************************
EEPROM 驅 動 文 件
*********************************************************************************************************/
#ifndef _AT24Cxx_H_
#define _AT24Cxx_H_
#include 'sys.h'
/*********************************************************************************************************
函 數 列 表
*********************************************************************************************************/
void AT24Cxx_Init( void ) ; //AT24C初始化
void IIC_Write_Data( u8 Address, u8 Data ) ; //寫入1個數據
void AT24Cxx_Write_nData( u16 Address, u8 *Buffer, u16 Len ) ; //寫入n個數據
void AT24Cxx_Read_Data( u16 Address, u8 *Data ) ; //讀取1個數據
void AT24Cxx_Read_nData( u16 Address, u8 *Buffer, u16 Len ) ; //讀取n個數據
上一篇:STM32學習中關于C語言基礎知識點
下一篇:STM32入門學習筆記之看門狗實驗(下)
推薦閱讀最新更新時間:2025-06-07 23:28




設計資源 培訓 開發板 精華推薦
- 解決方案 | 芯佰微助力電動車安全:通用型OPA、LDO、RS485芯片,提升報警器性能
- ASML 技術高級副總裁:已攜手蔡司啟動 5nm 分辨率 Hyper NA 光刻機開發
- 搭載Integrity Guard安全架構的芯片交付量突破100億, 充分彰顯英飛凌在安全領域的領導地位
- QNX與Vector簽署諒解備忘錄,共同打造基礎性車輛軟件平臺
- 瑞薩電子放緩增長預期,200 億美元營收目標延后五年至 2035 年
- 消息稱小米玄戒 O2 芯片有望“上車”,自研四合一域控制器已在鋪路
- 優化電動汽車車載充電器瞬態電壓保護和浪涌保護
- 新能源汽車電子水泵溫控系統及靜電浪涌
- 車載顯示接口測試趨勢分析
- Arm+AWS實現AI定義汽車 基于Arm KleidiAI優化并由AWS提供支持