搜索
bottom↓
回复: 25

STM32 I2C总线从机发送接收源码下载,有图有真相!

[复制链接]

出0入0汤圆

发表于 2014-5-13 15:29:19 | 显示全部楼层 |阅读模式
有什么用就不废话了吧,反正有的人有用,有的人没用....
功能:
1、接收主机发送的数据并储存在内部缓冲区,然后通过串口打印输出;
2、主机读取数据时,将内部缓冲区中的数据返回;
3、发送接收都采用中断方式实现,经验证基本上没什么问题;
串口打印输出的数据:

主机(Ginkgo USB-I2C)发送的数据:

主机(Ginkgo USB-I2C)接收的数据:

STM32单片机源码下载:

Ginkgo USB-I2C适配器软件下载:

PS:Ginkgo USB-I2C适配器也支持从机模式接收数据

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入0汤圆

发表于 2014-5-14 01:35:05 | 显示全部楼层
谢谢楼主的共享

出0入0汤圆

 楼主| 发表于 2014-5-14 10:50:50 | 显示全部楼层
            

出0入0汤圆

发表于 2014-5-14 10:59:02 | 显示全部楼层

出0入0汤圆

发表于 2014-5-14 11:05:23 | 显示全部楼层
收藏先,今后可能遇得到. 多谢分享!

出0入0汤圆

发表于 2014-5-14 11:21:14 | 显示全部楼层
为什么我装程序后打不开,说是计算机丢失libusb0.dll

出0入0汤圆

发表于 2014-5-14 12:05:43 | 显示全部楼层
谢谢楼主分享。

出0入0汤圆

 楼主| 发表于 2014-5-14 12:41:20 | 显示全部楼层
气球 发表于 2014-5-14 11:21
为什么我装程序后打不开,说是计算机丢失libusb0.dll

应该是要先安装USB-I2C适配器的驱动,你可以到www.viewtool.com去下载

出0入0汤圆

发表于 2014-5-19 22:47:07 | 显示全部楼层
谢谢楼主,正需要,好好看看

出5入42汤圆

发表于 2014-6-12 11:43:35 | 显示全部楼层
收藏马克

出0入0汤圆

发表于 2014-6-13 08:27:58 | 显示全部楼层
是硬件IIC吗。

出0入0汤圆

发表于 2014-6-13 11:07:46 | 显示全部楼层
MARK.....学习

出0入0汤圆

 楼主| 发表于 2014-6-13 16:27:15 | 显示全部楼层

当然...                        

出0入0汤圆

发表于 2015-8-8 23:31:36 | 显示全部楼层
非常感谢LZ分享

出0入0汤圆

发表于 2016-3-14 09:47:22 | 显示全部楼层
谢谢楼主的代码,本人刚好在实现stm32模拟从机eeprom功能,参考了iic初始化和中断函数,目前还在测试中。

出0入0汤圆

发表于 2016-4-3 16:04:39 | 显示全部楼层
很好用。谢谢

出0入0汤圆

发表于 2016-6-14 14:10:40 | 显示全部楼层
stm32  i2c作为从机调通了吗?

出0入0汤圆

 楼主| 发表于 2016-6-14 16:08:36 | 显示全部楼层
black.lu 发表于 2016-6-14 14:10
stm32  i2c作为从机调通了吗?

通了.............

出0入0汤圆

发表于 2016-6-14 16:54:15 | 显示全部楼层
能提供一下源码不?

出0入0汤圆

 楼主| 发表于 2016-6-14 16:57:11 | 显示全部楼层
black.lu 发表于 2016-6-14 16:54
能提供一下源码不?

不是有下载吗?要我送到你手里啊?

出0入0汤圆

发表于 2016-6-14 17:00:10 | 显示全部楼层
不好意思,说错了,源码已经提供了,我测试下来 我用的以下代码:
void I2cSlave_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIOB_InitStructure;
        /* configure I2C1 pins: SCL and SDA ---------------*/
        GPIOB_InitStructure.GPIO_Pin =  GPIO_Pin_6|GPIO_Pin_7;
        GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
        GPIO_Init(GPIOB, &GPIOB_InitStructure);
   

        GPIOB_InitStructure.GPIO_Pin =  I2C1_INT_PIN;
        GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_Out_OD
        GPIO_Init(GPIOB, &GPIOB_InitStructure);
        I2C1_INT_H();
}

void I2C1_NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        /* Configure and enable I2C1 interrupt ----------------*/
        NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}
void I2C1_Mode_Config(void)
{
        
        I2C_InitTypeDef  I2C_InitStructure;
        I2C_DeInit(I2C1);

        // I2C2configuration
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDR;
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_InitStructure.I2C_ClockSpeed = 400000;/*×î¸ß400k*/
        /*Enable I2C1 */
        I2C_Cmd(I2C1, ENABLE);
        I2C_Init(I2C1, &I2C_InitStructure);
        I2C_AcknowledgeConfig(I2C1, ENABLE);

        I2C1_NVIC_Configuration();
        // Enable I2C1 event and buffer interrupt
        I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, ENABLE);
}


void I2C1_Slave_Init()
{
        RCC_APB2PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);
        I2cSlave_GPIO_Init();
        I2C1_Mode_Config();
        I2C1_NVIC_Configuration();
}


中断如下:
volatile uint8_t I2C1_SlaveModeFlag;
volatile uint16_t I2C1_SlaveWriteDataNum;
uint16_t I2C1_SlaveWriteDataIndex;
uint16_t I2C1_SlaveReadDataIndex;

void I2C1_EV_IRQHandler(void)
{
        static uint16_t dataIndex = 0;
        if(((uint16_t)(I2C1->SR1)&(uint16_t)(0x0002))==0x0002){//Address matched (slave mode)
                if(((uint16_t)(I2C1->SR2)&(uint16_t)(0x0004))==0x0004){//Data bytes transmitted
                        I2C1_SlaveModeFlag = SLAVE_WRITE;
                        I2C1_SlaveWriteDataIndex = 0;
                        I2C1->DR = I2C_Slave_Send_Buffer[I2C1_SlaveWriteDataIndex++];//´Ó»ú·¢ËÍģʽÏÂдһ×Ö½ÚÊý¾Ýµ½Êý¾Ý¼Ä´æÆ÷
                }else{//Data bytes received
                        I2C1_SlaveModeFlag = SLAVE_READ;
                }
        }
        if(((uint16_t)(I2C1->SR1)&(uint16_t)(0x0040))==0x0040){//Data register not empty (receivers)
                if(I2C1_SlaveModeFlag == SLAVE_READ){
                        I2C_Slave_Send_Buffer[I2C1_SlaveReadDataIndex+dataIndex++] = I2C1->DR;
                }
        }
        if(((uint16_t)(I2C1->SR1)&(uint16_t)(0x0080))==0x0080){//Data register empty (transmitters)
                if(I2C1_SlaveModeFlag == SLAVE_WRITE){
                        I2C1->DR = I2C_Slave_Send_Buffer[I2C1_SlaveWriteDataIndex++];
                }
        }
        if(((uint16_t)(I2C1->SR1)&(uint16_t)(0x0010))==0x0010){//Stop condition detected
                I2C1 ->CR1 = I2C1 ->CR1;
                if(I2C1_SlaveModeFlag == SLAVE_WRITE){
                        I2C1_SlaveWriteDataIndex = 0;
                        I2C1_INT_H();        
                }
                if(I2C1_SlaveModeFlag == SLAVE_READ){
                        I2C1_SlaveReadDataIndex += dataIndex;
                        dataIndex = 0;
                }
        }
}
但是不知道为什么没有办法进去中断,测试波形发现,从机收到地址之后都没有回ack信号。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-6-14 17:18:43 | 显示全部楼层
black.lu 发表于 2016-6-14 17:00
不好意思,说错了,源码已经提供了,我测试下来 我用的以下代码:
void I2cSlave_GPIO_Init(void)
{

有可能地址配置不匹配

出0入0汤圆

发表于 2016-9-22 23:08:45 | 显示全部楼层
MARK,我也模拟了个,但由于主机速度过快,导致中断处理不过来,数据就位移了

出0入0汤圆

发表于 2017-9-23 15:05:23 | 显示全部楼层
楼主,这个USB-iic工具哪里有卖的?

出0入0汤圆

 楼主| 发表于 2017-9-26 14:40:29 | 显示全部楼层
jimyguo 发表于 2017-9-23 15:05
楼主,这个USB-iic工具哪里有卖的?

http://usb2xxx.taobao.com

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-9-27 07:13

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

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