娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月20日(星期二)

2018年05月20日 | STM32F407之模擬I2C(二)之24C128

發布者:靈感狂舞 來源: eefocus關鍵字:STM32F407  模擬I2C  24C128 手機看文章 掃描二維碼
隨時隨地手機看文章

模擬I2C測試24C128的讀寫

#define GPIO_PORT_I2C GPIOH/* GPIO端口 */

#define I2C_SCL_PIN GPIO_Pin_4/* 連接到SCL時鐘線的GPIO */
#define I2C_SDA_PIN GPIO_Pin_5/* 連接到SDA數據線的GPIO */
/* 定義讀寫SCL和SDA的宏 */
#define I2C_SCL_1()  GPIO_PORT_I2C->BSRRL = I2C_SCL_PIN/* SCL = 1 */
#define I2C_SCL_0()  GPIO_PORT_I2C->BSRRH = I2C_SCL_PIN/* SCL = 0 */


#define I2C_SDA_1()  GPIO_PORT_I2C->BSRRL = I2C_SDA_PIN/* SDA = 1 */
#define I2C_SDA_0()  GPIO_PORT_I2C->BSRRH = I2C_SDA_PIN/* SDA = 0 */


#define I2C_SDA_READ()   GPIO_ReadInputDataBit(GPIOH,GPIO_Pin_5)/* 讀SDA口線狀態 */
#define I2C_SCL_READ()    GPIO_ReadInputDataBit(GPIOH,GPIO_Pin_4)/* 讀SCL口線狀態 */
/****************************************************************************************
*函 數 名:bsp_InitI2c
*函數功能:初始化i2c的io
*形    參:無
*返 回 值:無
*****************************************************************************************/
void bsp_InitI2c(void)
{
GPIO_InitTypeDef GPIO_initStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);

GPIO_initStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_initStructure.GPIO_OType = GPIO_OType_OD;
GPIO_initStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_initStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_initStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOH,&GPIO_initStructure);
}


/****************************************************************************************
*函 數 名:i2c_Delay
*函數功能:延時
*形    參:無
*返 回 值:無
*****************************************************************************************/
static void i2c_Delay(void)
{
uint8_t i=0;
for(i = 0; i < 30; i++);
}


/****************************************************************************************
*函 數 名:i2c_start
*函數功能:開始信號  
*形    參:無
*返 回 值:無
*****************************************************************************************/
void i2c_start(void)
{
I2C_SCL_0();/*SCL為高電平,SDA由高到低的跳變 就是開始信號*/
i2c_Delay();
I2C_SDA_1();
i2c_Delay();
I2C_SCL_1();
i2c_Delay();
I2C_SDA_0();
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
}
/****************************************************************************************
*函 數 名:i2c_stop
*函數功能:結束
*形    參:無
*返 回 值:無
*****************************************************************************************/
void i2c_stop(void)
{
I2C_SCL_0();/*SCL在高電平期間,SDA由低到高的跳變 就是停止信號*/
i2c_Delay();
I2C_SDA_0();
i2c_Delay();
I2C_SCL_1();
i2c_Delay();
I2C_SDA_1();
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
}
/****************************************************************************************
*函 數 名:i2c_WaitAck
*函數功能:從器件應答
*形    參:無
*返 回 值:1 從器件應答
*****************************************************************************************/
uint8_t i2c_WaitAck(void)
{
uint8_t re;
uint16_t i=0;/*SCL為高電平 從器件把ASD拉低 稱為從器件應答*/
I2C_SCL_0();
i2c_Delay();
I2C_SDA_1();
i2c_Delay();
I2C_SCL_1();
i2c_Delay();
while(I2C_SDA_READ() && (i < 65530))/*防止從器件不應答 在這死等*/
{
i++;
}
if(i < 65530)/*小于65530 表示已經應答   具體i的值是多少我也不知道 這里只是大概*/
re = 1;
else
re = 0;
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
return re;
}
/****************************************************************************************
*函 數 名:i2c_Ack
*函數功能:主器件應答
*形    參:無
*返 回 值:無
*****************************************************************************************/
void i2c_Ack(void)
{
I2C_SCL_0();/*SCL為高電平 SDA為低電平表示主器件應答*/
i2c_Delay();
I2C_SDA_0();
i2c_Delay();
I2C_SCL_1();
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
}
/****************************************************************************************
*函 數 名:i2c_NAck
*函數功能:主器件不應答
*形    參:無
*返 回 值:無
*****************************************************************************************/
void i2c_NAck(void)
{
I2C_SCL_0();/*SCL為高電平 SDA為低電平表示主器件非應答*/
i2c_Delay();
I2C_SDA_1();
i2c_Delay();
I2C_SCL_1();
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
}
/****************************************************************************************
*函 數 名:i2c_SendByte
*函數功能:發送一個字節
*形    參:_ucByte 發送的字節
*返 回 值:無
*****************************************************************************************/
void i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;
I2C_SCL_0();
for( i = 0; i < 8; i++)
{
if(_ucByte & 0x80)
I2C_SDA_1();
else
I2C_SDA_0();/*SCL上升沿將數據寫入器件*/
i2c_Delay();
I2C_SCL_1();
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
_ucByte = _ucByte << 1;
}
I2C_SDA_1();/*釋放數據線*/
i2c_Delay();

}
/****************************************************************************************
*函 數 名:i2c_ReadByte
*函數功能:讀到的值
*形    參:無
*返 回 值:無
*****************************************************************************************/
uint8_t i2c_ReadByte(void)
{
uint8_t i;
uint8_t value = 0;
I2C_SDA_1();/*釋放數據線*/
for(i = 0; i < 8; i++)
{
value <<=1;
I2C_SCL_1();
i2c_Delay();
if(I2C_SDA_READ())/*讀SDA*/
{
value = value + 1;
}
else
{
value = value;
}
i2c_Delay();/*SCL下降沿將數據取出*/
I2C_SCL_0();
i2c_Delay();
}
return value;

}

/*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************                                                                      上面主要是模擬I2C時序                                                                                                                                                                    ************                                                                      下面就是對24C128的讀寫操作

*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/

#define EE_MODEL_NAME "AT24C128"
#define EE_DEV_ADDR 0xA0/* 設備地址 */
#define EE_PAGE_SIZE 64/* 頁面大小(字節) */
#define EE_SIZE (16*1024)/* 總容量(字節) */
#define EE_ADDR_BYTES 2/* 地址字節個數 */


#define I2C_WR 0/* 寫控制bit */
#define I2C_RD 1/* 讀控制bit */

uint8_t buf[EE_SIZE];
/****************************************************************************************
*函 數 名:eeprom_ReadBytes
*函數功能:eeprom讀字節
*形    參:_pReadBuf 存放讀取的數據  _usAddress 開始讀取的地址  _usSize讀取的大小
*返 回 值:1 表示讀取成功  0 表示讀取失敗
*****************************************************************************************/


uint8_t eeprom_ReadBytes(uint8_t *_pReadBuf,uint16_t _usAddress,uint16_t _usSize)
{
uint16_t i;
/*第一步:發起I2C啟動信號*/
i2c_start();
/*第二步:發送控制字節,高7位表示地址,最低位表示讀寫控制 0表示寫 1表示讀*/
i2c_SendByte(EE_DEV_ADDR | I2C_WR);
/*第三步:等待從器件應答 1表示應答 0 表示沒有應帶*/
if(i2c_WaitAck() != 1)
{
return 0;
}
/*第四步:發送讀取的地址 24C128 要發送2次地址*/
i2c_SendByte(_usAddress >> 8);
/*等待從器件應答 1表示應答 0 表示沒有應帶*/
if(i2c_WaitAck() != 1)
{
return 0;
}
/*發送讀取的地址 */
i2c_SendByte(_usAddress);
/*等待從器件應答 1表示應答 0 表示沒有應帶*/
if(i2c_WaitAck() != 1)
{
return 0;
}
/*第五步:重啟I2C總線  之后開始讀取數據*/
i2c_start();
/*第六步:發送控制字節 */
i2c_SendByte(EE_DEV_ADDR | I2C_RD);
/*等待從器件應答 1表示應答 0 表示沒有應帶*/
if(i2c_WaitAck() != 1)
{
return 0;
}
/*第七步:循環讀取數據*/
for(i = 0; i < _usSize; i++)
{
_pReadBuf[i] = i2c_ReadByte();/*讀一個字節*/
if( i != _usSize -1)/*不是最后一個主器件就要應帶,是最后一個就主器件非應答*/
{
i2c_Ack();
}
else
{
i2c_NAck();
}
}
/*第八步:發送I2C停止信號*/
i2c_stop();

return 1;

}
/****************************************************************************************
*函 數 名:eeprom_ReadTest
*函數功能:讀取整個24C128的數據
*形    參:無
*返 回 值:無
*****************************************************************************************/
void eeprom_ReadTest(void)
{
uint16_t i;
int32_t Time1,Time2;
Time1 = bsp_GetRunTime();/*獲取開始時間*/

if(eeprom_ReadBytes(buf,0,EE_SIZE))/*1 讀取成功 0讀取失敗*/
{
Time2 = bsp_GetRunTime();/*獲取結束時間*/
printf("讀eeprom成功\r\n");
}
else
{
printf("讀eeprom出錯\r\n");
}

for(i = 0;i < EE_SIZE ;i++)
{

if(i % 16 == 0)/*輸出16個字節換行*/
{
printf("\r\n");
}
printf(" %02X",buf[i]);/*輸出數據*/

}
printf("讀耗時: %dms,讀速度: %dB/s\r\n",Time2 - Time1,(EE_SIZE * 1000) / (Time2 - Time1));


}


/****************************************************************************************
*函 數 名:eeprom_WriteBytes
*函數功能:寫整個eeprom測試
*形    參:_pWriteBuf 寫入的值  _usAddress 寫入的地址 _usSize寫入的大小
*返 回 值:1 表示寫入成功 0 表示寫入失敗
*****************************************************************************************/
uint8_t eeprom_WriteBytes(uint8_t *_pWriteBuf,uint16_t _usAddress,uint16_t _usSize)
{
uint16_t i,m;
uint16_t usAddr;
uint16_t num = 0;
usAddr = _usAddress;

for( i = 0; i< _usSize; i++)
{
/*寫eeprom不可以像讀那樣連續讀取多個字節,寫每次只能在一個頁page
24C128每也64個字節*/
if (num % 64 == 0)/*寫入64個就要重新開始 因為每page為64*/
{
/*第一步:發送停止信號,啟動內部寫操作*/
i2c_stop();
/*通過循環判斷eeprom內部寫操作是否完成*/
for(m = 0; m < 100; m++)
{
/*第二步:發起I2C總線啟動信號*/
i2c_start();
/*第三步:發起控制字節,高7位是地址,最低位 0表示寫 1表示讀*/
i2c_SendByte(EE_DEV_ADDR | I2C_WR);
/*第四步:等待從器件應答 1表示應答 0 表示沒有應帶*/
if(i2c_WaitAck() == 1)
{
break;
}
if(m >= 100)/*大于100表示從器件沒有應答*/
{
return 0;
}
}
/*第五步:發送寫入的地址 24C128 要發送2次地址*/
i2c_SendByte(usAddr >> 8);
/*等待從器件應答 1表示應答 0 表示沒有應帶*/
if(i2c_WaitAck() != 1)
{
return 0;
}
/*發送寫入的地址*/
i2c_SendByte(usAddr);
/*等待從器件應答 1表示應答 0 表示沒有應帶*/
if(i2c_WaitAck() != 1)
{
return 0;
}
}
/*第六步:寫入數據*/
i2c_SendByte(_pWriteBuf[i]);
/*等待從器件應答 1表示應答 0 表示沒有應帶*/
if(i2c_WaitAck() != 1)
{
return 0;
}
num++;
usAddr++;/*地址增1*/
}
/*發送停止信號*/
i2c_stop();
return 1;
}


/****************************************************************************************
*函 數 名:eeprom_WriteTest
*函數功能:寫入數據
*形    參:無
*返 回 值:無
*****************************************************************************************/


void eeprom_WriteTest(void)
{
uint16_t i;
int32_t Time1,Time2;

for(i = 0; i < EE_SIZE; i++)
{
buf[i] = 0x01;/*填充要寫入的數據*/
}
Time1 = bsp_GetRunTime();/*獲取開始時間*/

if(eeprom_WriteBytes(buf,0,EE_SIZE))/*1 表示寫入成功 0表示失敗*/
{
Time2 = bsp_GetRunTime();/*獲取結束時間*/
printf("寫eeprom成功\r\n");
}
else
{
printf("寫eeprom錯誤\r\n");
}

printf("寫耗時: %dms,寫速度: %dB/s\r\n",Time2-Time1,(EE_SIZE *1000)/(Time2-Time1));
}


/*********************************************************************************************************************************************************************************************************************************************        下面就是Main函數   ********************************************************************************************************/


/*
*********************************************************************************************************
* 函 數 名: main
* 功能說明: c程序入口
* 形    參:無
* 返 回 值: 錯誤代碼(無需處理)
*********************************************************************************************************
*/
int main(void)
{
uint8_t ch;
/*
ST固件庫中的啟動文件已經執行了 SystemInit() 函數,該函數在 system_stm32f4xx.c 文件,主要功能是
配置CPU系統的時鐘,內部Flash訪問時序,配置FSMC用于外部SRAM
*/
bsp_Init();/*初始化I2C的IO*/
/* 進入主程序循環體 */
printf("1 - 讀EEPROM (%d 字節)\r\n", EE_SIZE);
printf("2 - 寫EEPROM (%d 字節,0x00-0xFF)\r\n", EE_SIZE);
while (1)
{
if(comGetChar(COM1,&ch))/*讀取串口數據*/
{
switch(ch)
{
case '1':
eeprom_ReadTest();/*測試讀數據*/
printf("\r\n");
break;
case '2':
eeprom_WriteTest();/*測試寫數據*/
printf("\r\n");
break;
default:
break;
}
}
}
}


關鍵字:STM32F407  模擬I2C  24C128 引用地址:STM32F407之模擬I2C(二)之24C128

上一篇:STM32F1使用I/0模擬I2C接口
下一篇:最后一頁

推薦閱讀

STM8S的硬件I2C還是存在問題,不敢貿然使用.#define SCL PE_ODR_ODR1#define SDA PE_ODR_ODR2#define SDAM PE_IDR_IDR2#define SET_SCL_OUT() {PE_DDR_DDR1=1; PE_CR1_C11 = 1; PE_CR2_C21 = 0;}#define SET_SDA_OUT() {PE_DDR_DDR2=1; PE_CR1_C12 = 1; PE_CR2_C22 = 0;}#define SET_SDA_IN() {PE_DDR_DDR2=0; PE_CR1_C12 = 0;...
Molex榮獲著名的 2018 年博世北美洲年度供應商獎,充分認可了Molex的表現、產品組合以及對客戶的承諾。 Molex負責交通運輸解決方案的高級副總裁兼總經理 Carrieanne Piccard 表示 :“從博世這家重要客戶與長期的合作伙伴手上獲得這一認可,對于Molex真的是一個很大的榮幸。雙方共同開發創新性的解決方案從而互惠互利,在過程中保持緊密的聯系以及密...
  隨著時代的進步,我國社會正處于急劇轉變的時代,是以機器人為代表的人工智能逐漸進入人們的視野。稅務機器人的出現預示著傳統財務行業正咋發生變革,一個“機器人流程自動化”的時代正悄悄來臨!那么,稅收機器人有什么優勢?稅務服務機器人報價簡介?   稅務機器人優勢   稅務機器人可以瞄準稅務單位費用管控痛點,全面升級產品,推出報賬與...
從哈工智能2021年一季度業績報來看,營收為5.04億元,較2020年同期增加100.42%,歸屬于上市公司股東的凈虧損為1074.38萬元,虧損同比擴大近30%。為了扭轉低迷的業績、止住下滑趨勢,哈工智能的資本運作仍在持續。(圖片來源:OFweek維科網)哈工智能2021年一季度財報公告披露了對江蘇哈工海渡工業機器人有限公司、江蘇哈工藥機科技股份有限公司、哈爾濱工...

史海拾趣

問答坊 | AI 解惑

電子開發設計心得

雞毛蒜皮之一:成本節約 現象一:這些拉高/拉低的電阻用多大的阻值關系不大,就選個整數5K吧 點評:市場上不存在5K的阻值,最接近的是4.99K(精度 1%),其次是5.1K(精度5%),其成本分別比精度為20%的4.7K高4倍和2倍。20%精度的電阻阻值只有1 ...…

查看全部問答∨

(高頻電路)基于m606設計的數字高頻對講機

該圖用 PROTEL繪制。是一款具有數字調頻功能的高頻對講機。 對高頻電路感興趣的朋友一定不要錯過了。 覺得不錯的請回帖…

查看全部問答∨

普通示波器及數字示波器基礎知識

普通示波器及數字示波器基礎知識…

查看全部問答∨

uCOS-ii移植

uCOS-ii的那些源代碼怎么移植到目標板上,它們是通過codeworrior 編譯之后才能燒進去 么?如果是的話,那些分散的源文件怎么整合到一塊去? 最后燒進去的是什么文件?…

查看全部問答∨

新手求助,例子中遇到的一個問題

按照下面文章中的方法逐步實現時: http://www.microsoft.com/china/MSDN/library/windev/WindowsCE/windowscedrivers.mspx 當編譯新建的TuxTest工程時,出現了幾個找不到相關PDB文件的錯誤,如 fatal error C1033: cannot open program databas ...…

查看全部問答∨

Cadence混合仿真出錯

在Cadence下做spectreVerilog混合仿真,但出現Error:problem encountered while executing verilog,但我查了一下,我的版本的verilog已經裝好了的,$verilog a.v也是正常的,怎么解決啊?…

查看全部問答∨

SOSO姐親啟

SOSO姐這個壇子里有沒有QQ群之內的???應該每個模塊建幾個交流群!這樣更方便交流,可以建個Q群聯盟!管理員嗎能者居之。如何?…

查看全部問答∨

LCD背光已經點亮了,但別的顯示不行,是什么原因?

MCU是STM32,用FSMC連接TFT LCD(LGDP4551),LCD接口模式采用MCU模式?,F在背光已經點亮了,但顯示其他顏色、畫線、顯示字符……都不行,可能會是什么原因呢?…

查看全部問答∨

CC2530數據手冊(中文版本)

供大家學習參考,有興趣玩Zigbee的朋友可以加我QQ(284382376),一起交流探討?!?

查看全部問答∨

RC充電測溫的原理

今天看到這個文檔,講的是利用RC電路充放電特性來檢測溫度,很有收益,發上來大家參考下。 程序是基于佑華的匯編語言,可做參考       實現方法: 步驟 1:將 PA1、PA2、PA3 都設為低電平輸出,使 C1 放電至放完。 步驟 2:將 P ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 静安区| 日照市| 楚雄市| 昌都县| 水富县| 金乡县| 准格尔旗| 临澧县| 藁城市| 仙居县| 漾濞| 莱芜市| 金塔县| 微博| 濮阳县| 永平县| 行唐县| 拜城县| 从江县| 施甸县| 马龙县| 津南区| 易门县| 汝南县| 福安市| 东源县| 嘉禾县| 烟台市| 平阴县| 六安市| 新巴尔虎左旗| 嘉鱼县| 莱阳市| 临西县| 庄浪县| 南阳市| 星座| 都兰县| 汕尾市| 涞源县| 衡南县|