历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2019年04月02日 | STM32 IO 模拟IIC I2C

2019-04-02 来源:eefocus


#define I2C_Speed        100000

#define I2C_EE             I2C1

 

 

 

#define uStatus0x80

#definedTime 5

 

 

#define I2C_EE_GPIO   GPIOB

#define I2C_EE_SCL         GPIO_Pin_5

#define I2C_EE_SDA         GPIO_Pin_4

#define I2C_EE_CLK         RCC_APB1Periph_I2C1

 

 

 

 

#define SCL_H         GPIOB->BSRR = GPIO_Pin_5

#define SCL_L         GPIOB->BRR  = GPIO_Pin_5

 

#define SDA_H         GPIOB->BSRR = GPIO_Pin_4

#define SDA_L         GPIOB->BRR  = GPIO_Pin_4

 

#define SCL_read      GPIOB->IDR  & GPIO_Pin_5

#define SDA_read      GPIOB->IDR  & GPIO_Pin_4

 

 

 

 

 

static unsigned int cntForInitial = 0;

static unsigned char fSigStatus = 0;

 

//static bool LedStatus = true;

 

void I2C_Init()

{

GPIO_InitTypeDef  GPIO_InitStructure;

 

    //* Configure I2C_EE pins: SCL and SDA

  GPIO_InitStructure.GPIO_Pin =  I2C_EE_SCL | I2C_EE_SDA;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

  GPIO_Init(I2C_EE_GPIO, &GPIO_InitStructure);

}

 

 

static void i2c_start()

{

 SDA_H;

 SCL_H;

 DelayUs(dTime);

 SDA_L;

 DelayUs(dTime);

 SCL_L;

 DelayUs(dTime);

 

 //LedStatus = !LedStatus;

 //f_LCT1(LedStatus);

}

 

 

 

/*

******************************************************************

Fuction:

Stop i2c

******************************************************************

*/

static void i2c_stop()

{

    SDA_L;

 SCL_H;

 DelayUs(dTime);

 SDA_H;

 DelayUs(dTime);

 SCL_H;

 DelayUs(dTime);

}

 

/*

******************************************************************

Fuction:

i2c  Master wait for ack

Only ack

******************************************************************

*/

static unsigned char i2c_rd_ack()

{

    unsigned char flag = 0;

    SDA_H;

 SCL_H;

 DelayUs(dTime/2);

 flag = SDA_read;

 DelayUs(dTime/2);

 SCL_L;

 DelayUs(dTime/2);

 if(flag == 1)

 return 0;

 return 1;

}

 

/*

******************************************************************

Fuction:

i2c  Byte transmission

Only Send,no ack,no stop

******************************************************************

*/

static unsigned char i2c_sb(unsigned char Byte)

{

unsigned char cnt;

SCL_L;

for(cnt=0;cnt<8;cnt++)

{

 

  if(Byte&0x80)

   SDA_H;

   else

   SDA_L;

   DelayUs(dTime);

   SCL_H;

   DelayUs(dTime);

   SCL_L;

   Byte <<= 1;

   DelayUs(dTime);

}

 

return i2c_rd_ack();

 

}

 

 

 

 

/*

******************************************************************

Fuction:

i2c Byte receive

Return Byte

******************************************************************

*/

static unsigned char i2c_rb()

{

unsigned char cnt;

unsigned char Byte=0;

 

SDA_H;

    for(cnt=0;cnt<8;++cnt)

      {

 

Byte <<= 1;

DelayUs(dTime);

SCL_H;

DelayUs(dTime);

if(SDA_read)

Byte |= 0x01;

SCL_L;

DelayUs(dTime);

      }

    return Byte;

}

 

 

 

/*

******************************************************************

Fuction:

i2c ACK  Master send

******************************************************************

*/

static void i2c_wr_ack(unsigned char ACK)

{

  if(ACK)

SDA_H;

else

SDA_L;

 SCL_H;

 DelayUs(dTime);

 SCL_L;

 DelayUs(dTime);

}

 

 

/*

******************************************************************

Fuction:

i2c Byte receive

Return Byte

******************************************************************

*/

uint8_t ReadReg(unsigned int addr)

{

    uint8_t temp;

 

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((uint8_t)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((uint8_t)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

i2c_start();

 

if(!i2c_sb(BRG_DEV_ADDR |0x01))

{

i2c_stop();

return 0;

}

temp = i2c_rb();

i2c_wr_ack(1);

i2c_stop();

return temp;

}

unsigned char WriteReg8(unsigned int addr,unsigned char wData)

{

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData)))

{

i2c_stop();

return 0;

}

i2c_stop();

//DelayUs(1);

return 1;

}

 

unsigned char WriteReg16(unsigned int addr,unsigned char wData1,unsigned char wData2)

{

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData2)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData1)))

{

i2c_stop();

return 0;

}

 

i2c_stop();

DelayUs(1);

return 1;

}

 

 

unsigned char WriteReg32(unsigned int addr,unsigned char wData1,unsigned char wData2,unsigned char wData3,unsigned char wData4)

{

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData4)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData3)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData2)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData1)))

{

i2c_stop();

return 0;

}

 

i2c_stop();

DelayUs(1);

return 1;

}


推荐阅读

史海拾趣

Austek Microsystems公司的发展小趣事

随着产品线的不断丰富和技术实力的不断提升,Austek Microsystems开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓海外市场,与多个国家和地区的客户建立了稳定的合作关系。同时,Austek Microsystems还注重品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。

First Switchtech公司的发展小趣事

在追求商业成功的同时,First Switchtech公司(或类似公司)也始终关注可持续发展和社会责任。公司致力于环保产品的研发和生产,推出了多款符合国际环保标准的电子开关产品。同时,公司还积极参与公益事业,通过捐赠资金、技术支持等方式帮助贫困地区改善教育条件、提升医疗水平等。这些举措不仅提升了公司的社会形象,也促进了公司与社会的和谐共生。

需要注意的是,以上故事是基于电子行业普遍趋势和可能发展路径的构想,并非直接针对First Switchtech公司的具体事实。如需了解该公司的真实发展情况,建议直接访问其官方网站或查阅相关新闻报道。

国炬(GOOGLL)公司的发展小趣事
相比其他功放电路,OCL电路的结构更为简单,有利于实现集成化。
CINCH公司的发展小趣事

随着全球环保意识的提高,CINCH公司也开始关注绿色发展和社会责任。公司加大了对环保技术的研发力度,推出了一系列绿色环保产品。同时,公司还积极参与社会公益事业,为社会做出贡献。这些举措不仅提升了公司的社会形象,也增强了公司的可持续发展能力。

这些故事虽然是虚构的,但它们反映了电子行业中企业可能经历的一些常见挑战和机遇。CINCH公司的发展壮大离不开技术创新、市场拓展、质量管理、人才培养和绿色发展等多方面的努力。这些因素共同作用,推动了公司在电子行业的持续发展和壮大。

Antenova公司的发展小趣事

除了优秀的产品外,Antenova公司还提供一系列专业的服务,包括产品结构确认和指导、主板Gerber文件和PCB堆叠预审和检查等。这些服务帮助客户更好地使用Antenova的产品,并提高了客户的满意度和忠诚度。通过提供卓越的服务,Antenova赢得了众多客户的信赖和支持,为公司的长期发展奠定了坚实基础。

Hi-Light Electronic Co Ltd公司的发展小趣事

Antenova公司积极寻求与其他行业领导者的战略合作,以推动公司的成长和发展。通过与全球知名的芯片制造商、设备生产商等建立合作关系,Antenova得以将其天线产品集成到更广泛的电子产品中,从而进一步扩大了市场份额。这些战略合作不仅提升了Antenova的品牌知名度,还为公司的长期发展提供了有力支持。

以上是关于Antenova公司发展起来的五个相关故事,这些故事展示了公司在技术创新、市场拓展、产品推出、专业服务以及战略合作等方面的努力和成就。这些成就为Antenova在电子行业中的成功奠定了坚实基础,并为公司未来的持续发展提供了有力保障。

问答坊 | AI 解惑

汽车管理系统2002

汽车管理系统2002…

查看全部问答>

测温电路???用热敏电阻

跪求关于 用热敏电阻设计的测温电路LCD显示PROTEUS仿真…

查看全部问答>

电容屏 touch驱动

有没有哪位大哥做过电容屏的touch驱动,或者了解这个的,希望给点思路。。。。…

查看全部问答>

DirectDraw加载位图的问题

                        ddrval = DirectDrawCreate(NULL, &g_pDD, NULL);                         ddrval = g_pDD ...…

查看全部问答>

这算什么意思

下了好几个Keil uvision 软件,有V3, 也有2的, 也装了个完全版的,还有序列号,网上下的, 很奇怪编译成功过几次的,突然再次提醒2K 的代码限制,(前面成功编译的代码长度肯定也超过2K的) *** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRIC ...…

查看全部问答>

如何在控制面板里添加蓝牙?(很急)

如题, 怎么生成bthpnl.cpl?catalog items里应该如何勾选?谢谢达人朋友解答!…

查看全部问答>

LM3S 8962

电话:15928776296 邮箱:1005450581@qq.com 地址:四川省成都市郫县团结四川师范大学成都学院电子程系工业与民用1班 姓名:赵健雄   我是嵌入的学习者,只有通过做一个东西,才能学到更多,只有做得更好,更强大 ,才会成长得更快。…

查看全部问答>

问一个Iap写flash的问题

我在用stm32 IAP 更新flash的时候 看到 最少是写半个字 但是我发现 编译完生成的bin文件 有单数字节 怎么处理着最后一个字节呢?…

查看全部问答>

请教一个STM32固件库中GPIO-SPEED的问题

今天在学习GPIO设置的程序时,对这一行程序有些不理解GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 疑问,这条指令是设置GPIO的输出速率,GPIO_Speed_50MHz是通过在stm32f10x_gpio.h中的 typedef enum {   GPIO_Speed_ ...…

查看全部问答>