/**
******************************************************************************
* @file i2c simu.c
* @brief simulation function
* @CPU STM32F051
* @compiler Keil uVision V4.74
* @author MetalSeed
* @copyright WSHHB
* @version V1.0.0
* @date 18-Sept-2014
* @modifydate20-Sept-2014
******************************************************************************
* @attention
*/
#include "boardAPI.h"
#include "i2cSimu.h"
#include "delay.h"
#include "uart.h"
GPIO_InitTypeDef GPIO_InitStructure;
/**
* @brief IIC Init
* @param A:
* @retval None
*/
void IIC_Init(void)
{
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOF, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ; //í?íìê?3?
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_6|GPIO_Pin_7); //PB10,PB11 ê?3???
}
/**
* @brief Set SDA Pin as Output Mode
* @retval None
*/
void SDA_OUT()
{
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
/**
* @brief Set SDA Pin as Input Mode
* @retval None
*/
void SDA_IN()
{
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;// !!!
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
/**
* @brief read input voltage from SDA pin
* @retval None
*/
BYTE SDA_READ()
{
return GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_7);
}
/**
* @brief output high form SDA pin
* @retval None
*/
void IIC_SDA_1()
{
GPIO_SetBits(GPIOF, GPIO_Pin_7);
}
/**
* @brief output low form SDA pin
* @retval None
*/
void IIC_SDA_0()
{
GPIO_ResetBits(GPIOF, GPIO_Pin_7);
}
/**
* @brief output high form SCL pin
* @retval None
*/
void IIC_SCL_1()
{
GPIO_SetBits(GPIOF, GPIO_Pin_6);
}
/**
* @brief output LOW form SCL pin
* @retval None
*/
void IIC_SCL_0()
{
GPIO_ResetBits(GPIOF, GPIO_Pin_6);
}
/**
* @brief Simulate IIC conmunication :Create Start signal
* @retval None
*/
void IIC_Start(void)
{
SDA_OUT(); //sda output
IIC_SDA_1();
IIC_SCL_1();
delayus(4);
IIC_SDA_0(); //START:when CLK is high,DATA change form high to low
delayus(4);
IIC_SCL_0(); //hold scl line, prepare to transmit data
}
/**
* @brief Simulate IIC conmunication : Create Stop signal
* @retval None
*/
void IIC_Stop(void)
{
SDA_OUT(); //sda output mode
IIC_SCL_0();
IIC_SDA_0(); //STOP:when CLK is high DATA change form low to high
delayus(4);
IIC_SCL_1();
IIC_SDA_1(); //indicate transmit over
delayus(4);
}
/**
* @brief Simulate IIC conmunication : wait for target device's ACK
* @retval ACK (0) : receive success
* @retval NACK(1) : receive unsuccess
*/
BYTE IIC_Wait_Ack(void)
{
BYTE ucErrTime = 0;
SDA_IN(); //set as input mode
IIC_SDA_1();
delayus(1);
IIC_SCL_1();
delayus(1);
while(SDA_READ())
{
ucErrTime++;
if(ucErrTime > 250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL_0(); //release scl line
return 0;
}
/**
* @brief Simulate IIC conmunication : make an ACK
* @retval None
*/
void IIC_Ack(void)
{
IIC_SCL_0();
SDA_OUT();
IIC_SDA_0();
delayus(2);
IIC_SCL_1();
delayus(2);
IIC_SCL_0();
}
/**
* @brief Simulate IIC conmunication : don't make an ACK
* @retval None
*/
void IIC_NAck(void)
{
IIC_SCL_0();
SDA_OUT();
IIC_SDA_1();
delayus(2);
IIC_SCL_1();
delayus(2);
IIC_SCL_0();
}
/**
* @brief Simulate IIC conmunication : Transmit one byte Data
* @param txd: data to be transmit
* @retval None
*/
void IIC_Send_Byte(BYTE txd)
{
BYTE i;
SDA_OUT();
IIC_SCL_0();//push down scl to start transmit data
for(i = 0; i < 8; ++i)
{
if(txd & 0x80)
{
IIC_SDA_1();
}
else
{
IIC_SDA_0();
}
txd <<= 1;
delayus(2);
IIC_SCL_1();
delayus(2);
IIC_SCL_0();
delayus(2);
}
}
//?á1??×??ú£?ack=1ê±£?·¢?íACK£?ack=0£?·¢?ínACK
/**
* @brief Simulate IIC conmunication : Receive one byte Data
* @param ack: Whether transmit ACK
* @retval the data have been receive
*/
BYTE IIC_Read_Byte(unsigned char ack)
{
unsigned char i, res = 0;
SDA_IN(); //SDA input mode
for(i = 0; i < 8; ++i )
{
IIC_SCL_0();
delayus(2);
IIC_SCL_1();
res <<= 1;
if(SDA_READ())
{
res++;
}
delayus(1);
}
if (!ack)
{
IIC_NAck();//make NACK
}
else
{
IIC_Ack(); //make ACK
}
return res;
}
/*JUST SOME TEST FUNTION DEMO*/
BYTE ReadData()
{
BYTE temp=0;
IIC_Start();
IIC_Send_Byte(0x80);
IIC_Wait_Ack();
IIC_Send_Byte(0xf5);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1);
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();
return temp;
}
void WriteData(BYTE DataToWrite)
{
IIC_Start();
IIC_Send_Byte(0x80);
if( IIC_Wait_Ack() == 0)
{
printf("Recieve ACK \n");
}
IIC_Send_Byte(0xf5);
IIC_Wait_Ack();
IIC_Send_Byte( DataToWrite );
IIC_Wait_Ack();
IIC_Stop();
delayms(10);
}
上一篇:STM32模擬IIC讀寫24CXX
下一篇:STM32F407和STM32F051主從I2C通信方法
推薦閱讀
史海拾趣
艾為電子自成立以來,一直致力于技術研發和產品創新。公司研發團隊不斷攻克技術難題,推出了一系列具有競爭力的產品。其中,音頻功放芯片作為公司的主打產品之一,憑借出色的性能和穩定的品質,贏得了市場的廣泛認可。此外,艾為還在信號鏈、電源管理等領域取得了顯著的技術突破,為公司的持續發展奠定了堅實的基礎。
為了降低生產成本、提高生產效率,Connector City公司開始實施產業鏈整合戰略。公司與上游原材料供應商和下游客戶建立了緊密的合作關系,實現了供應鏈的優化和協同發展。通過整合產業鏈資源,公司不僅降低了采購成本和市場風險,還提高了產品質量和交貨速度,進一步增強了市場競爭力。
在快速發展的同時,A-BRIGHT公司深知品質的重要性。公司加大了對品質管理的投入,引入了先進的生產線和檢測設備,并建立了嚴格的質量管理體系。通過持續改進和優化生產流程,A-BRIGHT的產品質量得到了顯著提升,贏得了客戶的信任和好評。
DESIGNERSYSTEMS公司的創始人在電子行業有著深厚的背景和獨特的見解。他們發現市場上缺乏一種能夠集成多種功能、高度定制化的電子設備設計解決方案。于是,他們創立了DESIGNERSYSTEMS,專注于提供從概念到原型再到量產的全方位設計服務。通過不斷的技術創新和對市場需求的精準把握,DESIGNERSYSTEMS迅速在電子行業樹立了自己的品牌形象,贏得了客戶的信賴。
作為一家有社會責任感的企業,CHINFA公司始終關注社會公益事業。公司積極參與扶貧濟困、捐資助學等公益活動,為社會做出了積極貢獻。同時,公司還注重員工培訓和福利保障,為員工提供了良好的工作環境和發展機會。這種對社會責任的擔當和履行,使CHINFA公司贏得了社會各界的廣泛認可和尊重。
這五個故事只是CHINFA公司發展歷程中的一部分,但它們卻充分展示了公司在電子行業中的堅韌不拔、追求卓越的精神風貌。相信在未來的發展中,CHINFA公司將繼續書寫更加輝煌的篇章。
隨著全球化進程的加速,CHINFA公司意識到必須走國際化發展道路。公司制定了詳細的國際化戰略,積極開拓海外市場。通過與國外知名企業的合作和交流,公司不斷提升自身的技術水平和市場競爭力。同時,公司還積極參加國際電子展會和論壇,展示自身實力和產品優勢,進一步提升了品牌知名度和影響力。
本文試圖回顧模擬示波器的簡單歷史,由于是簡史,采用編年體形式。歡迎批評,補充。 1947年5月,Tektronix 511,第一部擁有校準的放大器和校準的時基的示波器,開啟了商業示波器的嶄新時代。因為此前的儀器都沒有校準,意味著盡管 ...… 查看全部問答∨ |
|
有幸進入一家公司做ICT測試工程師,因為自己的發展需要。想學習電路,電氣這一塊的知識。而且是從零來過,以前沒有接觸過這一塊的知識。希望eeworld中的廣大高手指點迷津,指點我一下。讓我知道現在應該從哪里開始學起。如果有可能, ...… 查看全部問答∨ |
|
我在引導程序里面改過之后(顯示幾個填有不同顏色的矩形框),可以正常顯示! ----------------------------------------------------------------- 但在進入系統之后就不正常了!只能顯示一半!右邊一半沒有顯示 ----------------------------- ...… 查看全部問答∨ |
|
有無與外網通信的LM3_uCOS_II_Lwip例程下載,謝謝! 下來幾個uCOS_II_Lwip例程都不行,局域網正確(包括周立功LWIP例程的web服務器實驗),路由器設置絕對正確(其它的程序可以,不用懷疑?!? 查看全部問答∨ |