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

stm32I2C连续读写问题

[复制链接]
z5071507@126.co 提问时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版