搜索
bottom↓
12
返回列表 发新帖
楼主: ground

开源,STM32口线模拟I2C程序

[复制链接]

出0入0汤圆

发表于 2011-11-11 13:30:38 | 显示全部楼层
回复【81楼】acai1123
回复【12楼】hcdragon   
在页写的时候应该是有bug的,如果写入的地址不是页开始,那么,
    numofpage   =  length / i2c_pagesize;     //要写入的页数
    numofsingle =  length % i2c_pagesize;     //不足一页的个数
这个判断就是不正确的。
如i2c_pagesize=8,writeaddress=6,length=4,就会执行到
      if(numofpage== 0)   //数据小于一页  
      {
        i2c_bufferwrite(pbuffer,numofsingle,writeaddress,deviceaddress);   //写少于一页的数据
      }
此时,numofsingle=4,即从地址6连续写入4个字节,超过......
-----------------------------------------------------------------------

回复【81楼】acai1123
回复【12楼】hcdragon   
在页写的时候应该是有bug的,如果写入的地址不是页开始,那么,
    numofpage   =  length / i2c_pagesize;     //要写入的页数
    numofsingle =  length % i2c_pagesize;     //不足一页的个数
这个判断就是不正确的。
如i2c_pagesize=8,writeaddress=6,length=4,就会执行到
      if(numofpage== 0)   //数据小于一页  
      {
        i2c_bufferwrite(pbuffer,numofsingle,writeaddress,deviceaddress);   //写少于一页的数据
      }
此时,numofsingle=4,即从地址6连续写入4个字节,超过......
-----------------------------------------------------------------------

这样也不对吧,比如写入0X0开始的6个字节。用24C08,每页16字节
I2C_BufferWrite(pBuffer+I2C_PageSize-Addr,NumOfSingle-(I2C_PageSize-Addr),WriteAddress+I2C_PageSize-Addr);   

NumOfSingle-(I2C_PageSize-Addr)=6-(16-0)= -10

出0入0汤圆

发表于 2011-11-11 14:19:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-12 12:08:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-12 18:28:49 | 显示全部楼层
我在用到STM32的SPI和IIC时总是硬件和模拟同时弄,结果最后都是用的模拟,应该还是对stm32的硬件特性不够了解吧

出0入53汤圆

发表于 2011-11-18 09:44:59 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-22 23:15:41 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-12-7 09:32:49 | 显示全部楼层
不改I2C_delay,STM32103FCTT6下测试单字节读AXP192通过,单字节写时需要把I2C_delay的延时改大,使用1ms的没有问题,再小没有试
不知道是不是芯片的问题,望各位注意

出0入0汤圆

发表于 2011-12-15 20:29:29 | 显示全部楼层
大家就用模拟的吧,不掉棺材不流泪。

出0入0汤圆

发表于 2011-12-16 00:45:50 | 显示全部楼层
没用过IIC正的有那么差么

出0入0汤圆

发表于 2011-12-19 23:50:51 | 显示全部楼层
学习!!

出0入0汤圆

发表于 2012-2-28 08:47:19 | 显示全部楼层
学习!!

出0入0汤圆

发表于 2012-2-28 16:39:13 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-2-28 23:44:31 | 显示全部楼层
mark
iic

出0入0汤圆

发表于 2012-11-18 11:52:25 | 显示全部楼层
STM32模拟I2C

出0入0汤圆

发表于 2013-5-22 23:35:35 | 显示全部楼层
折腾了一天了,先收下,改天好好研究一下,果断放弃硬件I2C啦。谢楼主!

出0入0汤圆

发表于 2013-6-4 20:20:30 | 显示全部楼层
谢谢楼主 正需要。

出0入0汤圆

发表于 2013-10-10 16:32:22 | 显示全部楼层
这么多年了,貌似STM32的I2C还依旧那么难用。。。

出0入0汤圆

发表于 2013-10-10 16:35:59 | 显示全部楼层
好东西,谢分享

出0入0汤圆

发表于 2013-10-23 16:29:23 | 显示全部楼层
还木有用到这个功能啊

出0入0汤圆

发表于 2013-10-29 09:41:46 | 显示全部楼层
感谢  mark

出0入0汤圆

发表于 2013-11-1 17:06:46 | 显示全部楼层
不得不放弃硬件i2c,及其不稳定,谢楼主

出0入0汤圆

发表于 2013-11-1 22:54:16 | 显示全部楼层
。。。。。好东西。。。看看

出0入0汤圆

发表于 2014-3-1 18:45:13 | 显示全部楼层
标记一下。

出0入0汤圆

发表于 2014-3-4 17:16:26 | 显示全部楼层
很有用  谢谢楼主

出0入0汤圆

发表于 2014-3-4 18:00:36 | 显示全部楼层
谢谢楼主分享,以后用到I2C的时候再仔细看看。

出0入0汤圆

发表于 2014-3-7 10:28:15 | 显示全部楼层
顶!,就是IIc经常要用,很多人都说硬件不好用

出0入8汤圆

发表于 2014-4-27 19:05:23 | 显示全部楼层
感谢      

出0入0汤圆

发表于 2014-4-27 20:54:10 | 显示全部楼层
我贴一段硬件的STM32的程序,已验证通过的。
/*
²Ù×÷¶ÔÏóΪһ24C256
*/
#include "stm32f10x.h"

#define EEPROM_ADDR                0xA0
#define I2C_PAGESIZE        64                //24C256Ò³»º³åÊÇ64¸ö


void I2C_Configuration(void)
{
        I2C_InitTypeDef  I2C_InitStructure;
        GPIO_InitTypeDef  GPIO_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);

        /* PB6,7 SCL and SDA */
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
    I2C_DeInit(I2C1);
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = 0x30;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 200000;//200KËÙ¶È
   
        I2C_Cmd(I2C1, ENABLE);
        I2C_Init(I2C1, &I2C_InitStructure);
        /*ÔÊÐí1×Ö½Ú1Ó¦´ðģʽ*/
        I2C_AcknowledgeConfig(I2C1, ENABLE);

}

/***************************************************
**º¯ÊýÃû:I2C_ReadS
**¹¦ÄÜ:¶ÁÈ¡24C256¶à¸ö×Ö½Ú
**×¢ÒâÊÂÏî:24C256,16λµØÖ·,A0-A2¹Ì¶¨Îª0,´ÓÆ÷¼þµØַΪEEPROM_ADDR
***************************************************/
void I2C_ReadS_24C(u16 addr ,u8* pBuffer,u16 no)
{
    if(no==0)
                return;
       
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
               
        /*ÔÊÐí1×Ö½Ú1Ó¦´ðģʽ*/
        I2C_AcknowledgeConfig(I2C1, ENABLE);


        /* ·¢ËÍÆðʼλ */
    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,Ö÷ģʽ*/

    /*·¢ËÍÆ÷¼þµØÖ·(д)*/
    I2C_Send7bitAddress(I2C1,  EEPROM_ADDR, I2C_Direction_Transmitter);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

        /*·¢Ë͵ØÖ·*/
        I2C_SendData(I2C1, (u8)(addr>>8));
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*Êý¾Ý1ÒÑ·¢ËÍ*/
        I2C_SendData(I2C1, (u8)addr);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*Êý¾Ý2ÒÑ·¢ËÍ*/
               
        /*Æðʼλ*/
        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
       
        /*Æ÷¼þ¶Á*/
        I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
       
    while (no)
    {
                if(no==1)
                {
                     I2C_AcknowledgeConfig(I2C1, DISABLE);        //×îºóһλºóÒª¹Ø±ÕÓ¦´ðµÄ
                    I2C_GenerateSTOP(I2C1, ENABLE);                        //·¢ËÍֹͣλ
                }
            
                while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */
            *pBuffer = I2C_ReceiveData(I2C1);
            pBuffer++;
            /* Decrement the read bytes counter */
            no--;
    }
        //ÔÙ´ÎÔÊÐíÓ¦´ðģʽ
        I2C_AcknowledgeConfig(I2C1, ENABLE);
}

/****************************************************
**º¯ÊýÃû:I2C_Standby_24C
**¹¦ÄÜ:24CÊÇ·ñ×¼±¸ºÃÔÙдÈëµÄÅжÏ
**×¢ÒâÊÂÏî:±¾º¯Êý¿ÉÒÔÀí½âΪ:ÅÐæ
****************************************************/
void I2C_Standby_24C(void)      
{
  vu16 SR1_Tmp;
  do
  {
    /*Æðʼλ*/
    I2C_GenerateSTART(I2C1, ENABLE);
    /*¶ÁSR1*/
    SR1_Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);
    /*Æ÷¼þµØÖ·(д)*/
        I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter);
  }while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));
  
  /**/
  I2C_ClearFlag(I2C1, I2C_FLAG_AF);
  /*ֹͣλ*/   
  I2C_GenerateSTOP(I2C1, ENABLE);
}

/*************************************************
**º¯ÊýÃû:I2C_ByteWrite_24C
**¹¦ÄÜ:дһ¸ö×Ö½Ú
**×¢ÒâÊÂÏî:×ÖдÈëͬÑùÐèÒªµ÷ÓÃæÅжÏ
*************************************************/
void I2C_ByteWrite_24C(u16 addr,u8 dat)
{
                while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));  //iiiii
        /* Æðʼλ */
          I2C_GenerateSTART(I2C1, ENABLE);
          while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  

          /* ·¢ËÍÆ÷¼þµØÖ·(д)*/
          I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter);
          while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  
          /*·¢Ë͵ØÖ·*/
          I2C_SendData(I2C1, (u8)(addr>>8));
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*Êý¾Ý1ÒÑ·¢ËÍ*/
                I2C_SendData(I2C1, (u8)addr);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*Êý¾Ý2ÒÑ·¢ËÍ*/

        /* дһ¸ö×Ö½Ú*/
          I2C_SendData(I2C1, dat);
          while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
          /* ֹͣλ*/
          I2C_GenerateSTOP(I2C1, ENABLE);
  
          I2C_Standby_24C();
}

/*************************************************
**º¯ÊýÃû:I2C_PageWrite_24C
**¹¦ÄÜ:дÈëÒ»Ò³(ÒÔÄÚ)
**×¢ÒâÊÂÏî:´Ëº¯Êý¹©ÈºÐ´Èëµ÷ÓÃ
*************************************************/
void I2C_PageWrite_24C(u16 addr,u8* pBuffer, u8 no)
{
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

        /*Æðʼλ*/
        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

        /*Æ÷¼þµØÖ·(д)*/
        I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        /*дµØÖ·Öµ*/
        I2C_SendData(I2C1, (u8)(addr>>8));
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*Êý¾Ý1ÒÑ·¢ËÍ*/
        I2C_SendData(I2C1, (u8)addr);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*Êý¾Ý2ÒÑ·¢ËÍ*/

        while(no--)  
        {
          I2C_SendData(I2C1, *pBuffer);
          pBuffer++;
          while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        }
       
        /*ֹͣλ*/
        I2C_GenerateSTOP(I2C1, ENABLE);       
        I2C_Standby_24C();//IIIIIII
}



/*************************************************
**º¯ÊýÃû:I2C_WriteS_24C
**¹¦ÄÜ:ҳдÈë24C
**×¢ÒâÊÂÏî:24C256×î¶àÔÊÐíÒ»´ÎдÈë64¸ö×Ö½Ú
*************************************************/
void I2C_WriteS_24C(u16 addr,u8* pBuffer,  u16 no)
{
        u8 temp;

        //1.ÏÈ°ÑÒ³²»¶ÔÆëµÄ²¿·ÖдÈë
        temp=addr % I2C_PAGESIZE;
        if(temp)
        {
                temp=I2C_PAGESIZE-temp;
                I2C_PageWrite_24C(addr,pBuffer,  temp);
                no-=temp;
                addr+=temp;
                pBuffer+=temp;
                I2C_Standby_24C();
        }
        //2.´ÓÒ³¶ÔÆ뿪ʼд
        while(no)
        {
                if(no>=I2C_PAGESIZE)
                {
                        I2C_PageWrite_24C(addr,pBuffer,  I2C_PAGESIZE);
                        no-=I2C_PAGESIZE;
                        addr+=I2C_PAGESIZE;
                        pBuffer+=I2C_PAGESIZE;
                        I2C_Standby_24C();
                }
                else
                {
                        I2C_PageWrite_24C(addr,pBuffer,  no);
                        no=0;
                        I2C_Standby_24C();
                }
        }
}

出0入0汤圆

发表于 2014-4-27 21:17:12 | 显示全部楼层
路过路过赞下吧  stm32好难

出0入37汤圆

发表于 2014-5-28 09:34:07 | 显示全部楼层
谢谢lz,挺好用的

出0入0汤圆

发表于 2014-5-28 10:48:12 | 显示全部楼层
你这个是配用多大容量的I2C啊,我有个24C256的可以参考,但是有个小毛病一直没搞定

出0入0汤圆

发表于 2014-9-14 16:36:34 | 显示全部楼层
看来要放弃I2C了

出0入0汤圆

发表于 2014-9-14 16:44:17 | 显示全部楼层
看了I2C真的不行啊

出0入0汤圆

发表于 2014-9-14 16:50:03 | 显示全部楼层
mark  我喜欢spi

出0入0汤圆

发表于 2016-6-8 11:03:13 | 显示全部楼层
感谢大神分享

出0入0汤圆

发表于 2017-2-13 16:25:01 | 显示全部楼层
虚心学习 天天向上
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 00:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表