只是写了一 个简单的测试程序,上电就直接读取时间,程序如下:
void start(void)
{
sda=1;
Delay_us(10);
scl=1;
Delay_us(10);
sda=0;
Delay_us(10);
}
void stop(void)
{
sda=0;
Delay_us(10);
scl=1;
Delay_us(10);
sda=1;
Delay_us(10);
}
void ack(void)
{
unsigned char i=200;
scl=1;
Delay_us(10);
while ((sda==1)&&(i>0))i--;
scl=0;
Delay_us(10);
}
void iicinit(void)
{
sda=1;
scl=1;
}
void iicwr_byte(unsigned char dat)
{
unsigned char i;
scl=0;
for(i=0;i<8;i++)
{
if(dat&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
Delay_us(10);
scl=1;
Delay_us(10);
scl=0;
Delay_us(10);
}
}
void READ_TIM(void)
{
start(); //1
iicwr_byte(0x64); //2
ack(); //3
iicwr_byte(0x00); //4
ack(); //5
start(); //6
iicwr_byte(0x65); //7
ack(); //8
TIM_Second=iicre_byte();//9 读秒
ack(); //10
TIM_Minute=iicre_byte();//9 读分钟
ack(); //10
TIM_Hour=iicre_byte();//9 读小时
ack(); //10
stop(); //13
}
出来的实际波形图:
1111111.png (124.25 KB, 下载次数: 0)
下载附件
2019-5-8 03:27 上传
试了SDA接高后,需要1秒以后,RX8025才会置高,反应需要好久,且无视SCL的状态。
SCL需要一个下降沿和一个上升沿。所有位数据(包括ACK)会在SCL下降沿发送,在SCL上升沿接收。
以下模拟IIC的发送ACK和接收ACK函数供参考。(最好在PC上看,因为在手机屏幕上长注释会换行)
- //*****************************************************************************主机发送应答信号
- // SendAck_NBCA_MI2C Function (I2C)
- //-----------------------------------------------------------------------------
- // Return Value : None
- // Parameters : I2C_Master_TypeDef *, volatile I2C_MasterAckBit_TypeDef
- /*-----------------------------------------------------------------------------
- 功能说明:
- (1)函数返回值:
- (2)pMasterx_I2C:指向结构体 I2C_Master_TypeDef 的指针变量,HDI函数通过此指针变量操作I2C总线。
- (3)AckBit:主机要发送的应答信号。“MI2C_ACK”为正态应答信号(逻辑“0”),“MI2C_NACK”为反态应答信号(逻辑“1”)。
- ------------------------------------------------------------------------------*/
- void SendAck_NBCA_MI2C(I2C_Master_TypeDef * pMasterx_I2C, volatile I2C_MasterAckBit_TypeDef AckBit)
- {
- Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
- (AckBit)? (SDAW1()): (SDAW0());
- Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
- SCLW1();
- Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
- SCLW0();
- }
- //*****************************************************************************主机接收应答信号
- // RecAck_NBCA_MI2C Function (I2C)
- //-----------------------------------------------------------------------------
- // Return Value : uint8_t
- // Parameters : I2C_Master_TypeDef *
- /*-----------------------------------------------------------------------------
- 功能说明:
- (1)函数返回值:接收到的应答信号。数值“0”为正态应答信号(MI2C_ACK),数值“1”为反态应答信号(MI2C_NACK)。
- (2)pMasterx_I2C:指向结构体 I2C_Master_TypeDef 的指针变量,HDI函数通过此指针变量操作I2C总线。
- ------------------------------------------------------------------------------*/
- uint8_t RecAck_NBCA_MI2C(I2C_Master_TypeDef * pMasterx_I2C)
- {
- volatile uint8_t AckBit;
- //-------------------------------------------------------------
- Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
- SDAW1();
- Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
- SCLW1();
- AckBit = (SDAR())? (MI2C_NACK): (MI2C_ACK);
- Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
- SCLW0();
- //-------------------------------------------------------------
- return AckBit;
- }
复制代码试了,还是不行,奇怪了。
222.jpg (110.08 KB, 下载次数: 0)
下载附件
2019-5-8 22:23 上传
一周热门 更多>