原创 STM32使用模拟I2C读写24C02

2010-4-27 17:12 8356 14 25 分类: MCU/ 嵌入式

    近日,调试STM32的I2C读写24C02,果然出现了各位同仁出现的莫名的时序问题,在尝试官方和非官方的N的平方个版本后,发现总是存在问题。决定改用模拟I2C,很快就调试完毕。这里给各位同仁提个醒,每个片子都有其优势和劣势,像STM32他的技术支持没法和ZLG相比,片子本身又有I2C之类的问题,也有优势,价格便宜啊,供货充足等是他的优势,各位选片子衡量一下利弊吧。在总结和借鉴网友的程序的基础上,我调试出了这个可以直接移植到工程中的文件,希望能对大家有所帮助。


   主程序如下,工程见附件:


*******************************************************************************
* File Name             : I2C_24c02_simulink.c
* Author                : Rasar Yao
* Date First Issued     : 04/26/2010
* Deion           : I2C_24c02_simulink_TEST
********************************************************************************/
#include "stm32f10x_lib.h"


/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
u8 Tx1_Buffer[] = "123456789abcdef";



/* Private variables ---------------------------------------------------------*/
static volatile ErrorStatus HSEStartUpStatus = SUCCESS;


void RCC_Configuration(void);
void I2C_GPIO_Config(void)  ;


extern bool I2C_WriteByte(u8 SendByte, u16 WriteAddress, u8 DeviceAddress);
extern bool I2C_ReadByte(u8* pBuffer,   u8 length,     u16 ReadAddress,  u8 DeviceAddress);


int main(void)
{


    RCC_Configuration();
 I2C_GPIO_Config();


 I2C_WriteByte(0x55, 0x30,  0xA0) ;
 I2C_ReadByte(Tx1_Buffer,   0x02,     0x30,  0xA0);
 
  while(1)
  {
  }
}



/*******************************************************************************
* Name  : RCC_Configuration
* Deion    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/  
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();


  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);


  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();


  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
   
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
 
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);
 
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
 
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
 
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
 
    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
 
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
 
    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }


  /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD , ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF , ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO  , ENABLE);
}


void I2C_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  /* Configure I2C1 pins: SCL and SDA */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

PARTNER CONTENT

文章评论11条评论)

登录后参与讨论

用户377235 2014-4-1 11:46

没附件没用啊

用户604328 2013-12-30 10:26

dsf

用户377235 2013-11-8 14:18

附件呢

用户401898 2013-8-7 21:33

兄弟,说好的附件呢?

用户377235 2013-2-8 22:01

很好呀!

用户377235 2013-1-14 13:57

附件没有

用户1486210 2012-10-19 12:59

哪有附件

用户420673 2012-6-22 13:48

兄弟,不全啊!

用户1614452 2012-4-11 22:42

正需要 谢谢

用户567481 2010-8-31 17:31

非常感谢,正需要!
相关推荐阅读
用户1393282 2010-04-14 13:28
ARM开发总结的小知识 Code, RO-data,RW-data,ZI-data
 ARM开发总结的小知识 字节 8位半字 16位字   32位Code, RO-dataRW-data,ZI-dataCode为程序代码部分RO-data 表示 程序定义的常量 const temp;...
用户1393282 2010-04-10 20:53
uCOS-ii中文书(邵贝贝)
很经典的一本书。...
用户1393282 2009-11-03 15:23
经典子程序集锦
1、当单片机与某模块用并行通信时,你是否遇到过PCB板上Px.0~Px.7刚好连接模块的D7~D0的数据接口的情况,此时可能需要将八位二进制数倒序处理。如:将“0100 1101”变为“1011 00...
用户1393282 2009-08-14 16:37
RTX 演示
这是一个来自官方的文档,讲的还可以。。。...
用户1393282 2009-08-06 16:47
轻松学ARM原创系列之在MDK下调试H-JTAG+Wiggler
轻松学ARM原创系列之<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />在MDK下调试...
EE直播间
更多
我要评论
11
14
关闭 站长推荐上一条 /3 下一条