|
做东西,需要用到MMA7660,以前写的IIC代码跟U盘一起丢掉了~~只好重写。
发现一个诡异的问题,起始位-->写器件地址,之后,MMA7660拉低了SDA,给出了应答信号。
但是,拉低SDA之后就一直不"放开"SDA,导致后面SDA输出高电平(3.3V)时,量引脚电压只有0.9V……,
东搞西搞的,发现,起始位-->写器件地址,之后,在SCL上继续输出10个时钟(↑-->↓),MMA7660才会放开SDA。
一直等待都没用,一定要10个时钟送过去,MMA7660才放开SDA……
不只有各位有没有遇到过这个问题,怎么解决的呢?
PS: SDA、SCL,外部上拉和IO口内部上拉都试过了,结果是一样的。
从器件地址是从MMA7660FC的手册上得知的,(0x98 & R/W),写器件地址时,乱写其他的地址,MMA7660就不会给出响应信号(拉低SDA)。
说明,这家伙的确是给出了回响信号的,但是为什么要10个时钟以后才放开SDA呢?
附上代码--松翰上的汇编~~- IIC_StartBit:
- BSET SDA_Data
- BSET SCL
- CALL Delay5US
- BCLR SDA_Data
- CALL Delay5US
- BCLR SCL
- CALL Delay5US
- RET
复制代码- .data
- kkk ds 1
- .code
- IIC_WrtByte:
- movm IIC_TMP0, #IIC_BIT_NUM
- IIC_WrtByte_0:
- RLCM IIC_Data
- movb SDA_Data, FC
- CALL Delay5US
- BSET SCL
- CALL Delay5US
- BCLR SCL
- CALL Delay5US
- DECMS IIC_TMP0
- JMP IIC_WrtByte_0
- BCLR SDA_Crl // SDA置为输入,接收应答信号.
- CLR IIC_TimeOutCnt // 检查是否超时
- @@: _jge IIC_TimeOutCnt, #2, IIC_TimeOut
- BTS0 SDA_Data // 感知低电平
- JMP @B
- @@: CALL Delay5US
- CALL Delay5US
- CALL Delay5US
- CALL Delay5US
- BSET SCL
- CALL Delay5US
- CALL Delay5US
- CALL Delay5US
- CALL Delay5US
- BCLR SCL
- incms kkk
- // _jge IIC_TimeOutCnt, #18, IIC_TimeOut
- BTS1 SDA_Data
- JMP @B
- movm IIC_Error, #IIC_NO_ERROR
- IIC_WrtByte_END:
- BSET SDA_Crl // SDA置为输出
- CALL Delay5US
- RET
- IIC_TimeOut:
- movm IIC_Error, #IIC_TIME_OUT
- JMP IIC_WrtByte_END
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|