你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32I2C连续读写问题

[复制链接]
z5071507 提问时间:2011-12-15 19:26 /
下面是写数据 与读数据部分
void I2C_Send_n_Data(u16 addr,u8 *data,u8 len)//数据地址,数据指针,要写数据长度
{
I2C_Cmd(I2C1,DISABLE);
I2C_Cmd(I2C1,ENABLE);
ScrollPage:
I2C_AcknowledgeConfig(I2C1, ENABLE);
while(((u16)(I2C1->SR2)&(u16)(0x0002))==0x0002);
I2C_GenerateSTART(I2C1,ENABLE);
while(!(((u16)(I2C1->SR1)&(u16)(0x0001))));
while(!((u16)(I2C1->SR2)&(u16)(0x0011))==0x0011);
I2C_Send7bitAddress(I2C1,0xA0, I2C_Direction_Transmitter);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0082))==0x0082);
while(!((u16)(I2C1->SR2)&(u16)(0x0007))==0x0007);
I2C_SendData(I2C1, (addr>>8)&0xff);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0080))==0x0080);
while(!((u16)(I2C1->SR2)&(u16)(0x0007))==0x0007);
I2C_SendData(I2C1, addr&0xff);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0080))==0x0080);
while(!((u16)(I2C1->SR2)&(u16)(0x0007))==0x0007);
I2C_SendData(I2C1, *data++);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0080))==0x0080);
while(!((u16)(I2C1->SR2)&(u16)(0x0007))==0x0007);
addr++;
len--;
 while(len)
   {
        if((addr%128)!=0)//由于一页写完需要产生一个停止信号,所以此处需要判断一页是否写完
 {
            I2C_SendData(I2C1,*(data++));
            delay();
      while(!((u16)(I2C1->SR1)&(u16)(0x0080))==0x0080);
            while(!((u16)(I2C1->SR2)&(u16)(0x0007))==0x0007);
           
            addr++;
            len--;
        }
        else
 {
            I2C_GenerateSTOP(I2C1,ENABLE);
            goto ScrollPage;
        }
    }
I2C_GenerateSTOP(I2C1,ENABLE);
delay();
while(((u16)(I2C1->SR2)&(u16)(0x0002))==0x0002);
}
void I2C_Read_n_Data(u16 addr,u8 *data,u8 len)
{
u8 i;
I2C_Cmd(I2C1,DISABLE);
I2C_Cmd(I2C1,ENABLE);
I2C_AcknowledgeConfig(I2C1, ENABLE);
I2C_GenerateSTART(I2C1,ENABLE);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0001))==0x0001);
while(!((u16)(I2C1->SR2)&(u16)(0x0011))==0x0011);
I2C_Send7bitAddress(I2C1,0xA0, I2C_Direction_Transmitter);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0082))==0x0082);
while(!((u16)(I2C1->SR2)&(u16)(0x0007))==0x0007);
I2C_SendData(I2C1, (addr>>8)&0xff);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0080))==0x0080);
while(!((u16)(I2C1->SR2)&(u16)(0x0007))==0x0007);
I2C_SendData(I2C1, addr&0xff);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0080))==0x0080);
while(!((u16)(I2C1->SR2)&(u16)(0x0007))==0x0007);
I2C_GenerateSTART(I2C1,ENABLE);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0001)));
while(!((u16)(I2C1->SR2)&(u16)(0x0011))==0x0011);
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_Send7bitAddress(I2C1,0xA0, I2C_Direction_Receiver);
delay();
while(!((u16)(I2C1->SR1)&(u16)(0x0082))==0x0082);
while(!((u16)(I2C1->SR2)&(u16)(0x0007))==0x0007);
if(len>1)
    {
        for(i=0;iSR1)&(u16)(0x0040))==0x0040);
     while(!((u16)(I2C1->SR2)&(u16)(0x0003))==0x0003);//主模式,总线忙,字节发送结束
            delay();
     while(!((u16)(I2C1->SR1)&(u16)(0x0004))==0x0004);
            *data=I2C_ReceiveData(I2C1);//读出DR寄存器中的值
            I2C_AcknowledgeConfig(I2C1,ENABLE);//应答使能
            data++;
        }
    }
 while(!((u16)(I2C1->SR1)&(u16)(0x0040))==0x0040);
while(!((u16)(I2C1->SR2)&(u16)(0x0003))==0x0003);//主模式,总线忙,字节发送结束
 delay();
 while(!((u16)(I2C1->SR1)&(u16)(0x0004))==0x0004);
*data=I2C_ReceiveData(I2C1);//读出DR寄存器中的值
I2C_AcknowledgeConfig(I2C1,DISABLE);//应答失能,无应答
I2C_GenerateSTOP(I2C1,ENABLE);
delay();
while(((u16)(I2C1->SR2)&(u16)(0x0002))==0x0002);//等待总线通信结束}
其中我在串口中断中用到了这两个读写函数,假如我设置一次性让串口输出50个数据,这程序总是只有第一个数是正确的,另外49个数都是ff,本人菜鸟,请高手解答,一下是中断中应用部分,其中p和q是我所设置的两个指针,指向要存储的数据的,其中q是和c[j
]对应的
if(i>49)
{
 i=0;
 I2C_Send_n_Data(0x00000000,p,50);
 delay();
 I2C_Read_n_Data(0x00000000,q,50); 
 
 for(j=0;jSR&0X0040));//等待发送完成
 }
}
 USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志位
收藏 评论3 发布时间:2011-12-15 19:26

举报

3个回答
回答时间:2011-12-16 09:00:35

RE:stm32I2C连续读写问题

1、串口中断的处理,当你使用串口中断的时候,发送数据的时候要用到的指针一定是数组,而且发送的数组长度也必须是小于数组的。
2、I2C数据读取的时候,也必须是数组存放,不能是指针存放。因为你不知道指针会指到什么地址。
火雷达 回答时间:2011-12-18 21:12:52

回复:stm32I2C连续读写问题

帮顶
stary666 回答时间:2015-7-17 10:09:40
顶一下,,,,,,,,

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版