打印
[STM32F1]

stm 32 iic 死了 帮忙看看问题

[复制链接]
2775|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1136632326|  楼主 | 2014-4-16 22:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
iic, STM, EMI, ck, ni
#include "stm32f10x.h"

int main(void)
{   
  SystemInit();// clock
        RCC->APB2ENR|=1<<14; //enable usart1
        RCC->APB2ENR|=1<<2; //enable gpioa
        RCC->APB1ENR|=1<<21; //enable iic
        RCC->APB2ENR|=1<<3; //enable gpiob
        GPIOA->CRH|=0X000008B0;
        GPIOB->CRL|=0Xff000000;
        USART1->SR|=1<<13;
        USART1->BRR=0X1D4A;
        RCC->APB1RSTR  |= 1<<21;      
        RCC->APB1RSTR  &= ~(1<<21);   

       
        I2C1->CR2|=8;
        I2C1->CCR|=4;
        I2C1->TRISE|=9;
        I2C1->CR1|=(1<<10+1<<6);
        I2C1->CR2|=1<<10;       
        I2C1->CR2|=1<<9;
        I2C1->CR2|=1<<8;       
        I2C1->OAR1|=1<<14;
        I2C1->CR1|=1;
       
       
        while(1)
        {
                I2C1->CR1|=1<<8; //start
    while(!(I2C1->SR1&1)) //start sb
                {}
                I2C1->DR=0XA0; //write address
                while(!(I2C1 -> SR1&2))
                {}
               
                        I2C1->DR=0XA0;
               


               
       
               
        }
               


}



没有中断
沙发
1136632326|  楼主 | 2014-4-16 22:57 | 只看该作者
iic就死在了  while(!(I2C1 -> SR1&2))

使用特权

评论回复
板凳
1136632326|  楼主 | 2014-4-16 23:15 | 只看该作者
大神帮忙看看  小弟感激不尽。。。代码的可读性不是太好。。。今天时间太晚了没顾得上添加注释,就快熄灯了。。

使用特权

评论回复
地板
1136632326|  楼主 | 2014-4-16 23:16 | 只看该作者
这是测试代码… 以后的还没有写。。。

使用特权

评论回复
5
1136632326|  楼主 | 2014-4-16 23:17 | 只看该作者
老大们。。。帮帮我。。。我困扰了很长时间

使用特权

评论回复
6
1136632326|  楼主 | 2014-4-16 23:21 | 只看该作者
老大们。我是不是配置的有问题??

使用特权

评论回复
7
1136632326|  楼主 | 2014-4-16 23:22 | 只看该作者
坛友们。大家用过iic的说说感言吧…

使用特权

评论回复
8
1136632326|  楼主 | 2014-4-16 23:32 | 只看该作者
程序只写了一部分,一步一步调试的写的。。。

使用特权

评论回复
9
1136632326|  楼主 | 2014-4-17 13:20 | 只看该作者
大家帮个帮啊


使用特权

评论回复
10
1136632326|  楼主 | 2014-4-17 13:21 | 只看该作者
难道真的要悬赏才能解决?、

使用特权

评论回复
11
xkxxzw| | 2014-4-17 14:11 | 只看该作者
用官方的固件库吧,STM32 的IIC不太好用,直接操作寄存器,你会想哭的。。

使用特权

评论回复
12
elec921| | 2014-4-17 14:46 | 只看该作者
设置一个超时计数器,超时不响应则复位IIC,重启通信

使用特权

评论回复
13
anybody| | 2014-4-17 15:26 | 只看该作者
ST的I2C不能单步调试,否则可能会影响状态寄存器SR1和SR2的某些位。我调的时候都是用个变量存储SR1和SR2的寄存器值
,然后用串口打印出来调的。按照ST给的Reference Manual的时序测试没问题,但单步调试会有问题。

使用特权

评论回复
14
Marco-Marco| | 2014-4-17 16:07 | 只看该作者
逻辑分析仪看波形是最直接的。看有没有应答

使用特权

评论回复
15
free_90| | 2014-4-17 18:01 | 只看该作者
最好不要单步调试看寄存器的值,单步很可能影响正常的通信,用官方的固件库也会的,我就发生过这种情况,最好全部配置好了试试

使用特权

评论回复
16
ddb_21ic| | 2014-4-17 18:29 | 只看该作者
通常,数据量都不大,用软件模拟更简单

使用特权

评论回复
17
soso| | 2014-4-17 19:22 | 只看该作者
ttttttttttttttttttttt

使用特权

评论回复
18
dawei360| | 2014-4-17 22:24 | 只看该作者
我觉得IIC 最好是通过示波器来调,看波形,看ACK

使用特权

评论回复
19
2545958269| | 2014-4-17 23:30 | 只看该作者
不是一直说STM32 IIC 有问题吗,多开几个中断的话好像就时序出问题了

使用特权

评论回复
20
smail_sam_chen| | 2014-4-18 13:31 | 只看该作者
建议还是用模拟的吧,我上次用官方的库函数搞了一个,跑两下就挂掉了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

25

帖子

0

粉丝