您好,
请在下面找到用于 I2C 通信的 TI 示例代码
/*用户代码开始(0)*/
/*用户代码结束*/
/*包含文件*/
#include "hL_sys_common.h"
/*用户代码开始(1)*/
#include "HL_i2c.h"
/*用户代码结束*/
/*用户代码开始(2)*/
#define DATA_COUNT 10.
#define Master_Address 0x26
#define Slave_Address 0x8
#define Slave_Word_address 0x00
#define RECEIVE_DATA_setup 0x1 // 1字地址
uint8_t TX_Data_Master[DATA_COUNT]={0x10、0x11、0x12、0x13、0x14、0x15、0x16、0x17、0x18、0x19};
uint8_t RX_Data_Master[DATA_COUNT]={0};
uint8_t TX_Data_Slave[10]={0x20、0x21、0x22、0x23、0x24、0x25、0x26、0x27、0x28、0x29};
uint8_t RX_Data_Slave[10]={0};
#define PCF8570_address 0x57 //在 PCF8570中所有 A0、A1、A2均连接到3.3V
uint32_t temp1、temp2;
/*用户代码结束*/
void main (void)
{
/*用户代码开始(3)*/
int repeat = 0;int delay = 0;
/*根据 GUI 进行 I2C 初始化
*模式=主设备-发送器
*波特率= 100KHz
*计数= 10
*位计数= 8位
*
i2cInit();
//主传输功能//
/*配置要与*/通话的从机地址
i2cSetSlaveAdd (i2cREG1、PCF8570_address);
/*将方向设置为发送器*/
/*注意:可选-在 Init 中完成*/
i2cSetDirection (i2cREG1、I2C_transmitter);
/*配置数据计数*/
/*数据计数+ 1 (字地址)*/
i2cSetCount (i2cREG1、data_count + 1);
/*将模式设置为主设备*/
i2cSetMode (i2cREG1、I2C_MASTER);
/*设置编程计数后停止*/
i2cSetStop (i2cREG1);
/*发送开始条件*/
i2cSetStart (i2cREG1);
/*发送字地址*/
i2cSendByte (i2cREG1、Slave_Word_address);
/*轮询模式下的 Transmit data_count 数据数量*/
i2cSend (i2cREG1、DATA_COUNT、TX_Data_Master);
/*等待总线忙被清除*/
while (i2cIsBusy (i2cREG1)=true);
/*等待直到检测到停止*/
while (i2cIsStopDetected (i2cREG1)=0);
/*清除停止条件*/
i2cClearSCD (i2cREG1);
/*在开始下一个块之前使用 Simple Dealya */
/*取决于从属设备准备就绪的速度*/
for (delay=0;delay<100000;delay++);
//主接收功能//
/********* /
/********* /
/*等待 MST 位被清零,这将进行
*清除总线忙后的几个周期*/
while (i2cIsMasterReady (i2cREG1)!= true);
/*配置要与*/通话的从机地址
i2cSetSlaveAdd (i2cREG1、PCF8570_address);
/*将方向设置为发送器*/
/*注意:可选-在 Init 中完成*/
i2cSetDirection (i2cREG1、I2C_transmitter);
/*配置数据计数*/
/*读取之前从器件地址+字地址写入操作*/
i2cSetCount (i2cREG1、receive_data_setup);
/*将模式设置为主设备*/
i2cSetMode (i2cREG1、I2C_MASTER);
/*设置编程计数后停止*/
i2cSetStop (i2cREG1);
/*发送开始条件*/
i2cSetStart (i2cREG1);
/*发送字地址*/
i2cSendByte (i2cREG1、Slave_Word_address);
/*等待总线忙被清除*/
while (i2cIsBusy (i2cREG1)=true);
/*等待直到检测到停止*/
while (i2cIsStopDetected (i2cREG1)=0);
/*清除停止条件*/
i2cClearSCD (i2cREG1);
/********* /
/********* /
/*等待 MST 位被清零,这将进行
*清除总线忙后的几个周期*/
while (i2cIsMasterReady (i2cREG1)!= true);
/*配置要与*/通话的从机地址
i2cSetSlaveAdd (i2cREG1、PCF8570_address);
/*将方向设置为接收器*/
i2cSetDirection (i2cREG1、I2C_RECEIVER);
/*配置数据计数*/
/*注:可选-在 Init 中完成,除非用户想要更改*/
i2cSetCount (i2cREG1、data_count);
/*将模式设置为主设备*/
i2cSetMode (i2cREG1、I2C_MASTER);
/*设置编程计数后停止*/
i2cSetStop (i2cREG1);
/*发送开始条件*/
i2cSetStart (i2cREG1);
/*轮询模式下的 Transmit data_count 数据数量*/
i2cReceive (i2cREG1、DATA_COUNT、RX_Data_Master);
/*等待总线忙被清除*/
while (i2cIsBusy (i2cREG1)=true);
/*等待直到检测到停止*/
while (i2cIsStopDetected (i2cREG1)=0);
/*清除停止条件*/
i2cClearSCD (i2cREG1);
asm (" nop");
asm (" nop");
asm (" nop");
while (1);
/*用户代码结束*/
}
/*用户代码开始(4)*/
/*用户代码结束*/
--------------------------------------------------
在此代码中,
问题1:
/*发送开始条件*/
i2cSetStart (i2cREG1);
高于 API i2cSetStart 发送启动条件吗?
问题2:
/*配置要与*/通话的从机地址
i2cSetSlaveAdd (i2cREG1、PCF8570_address);
API i2cSetSlaveAdd 只是配置从器件地址还是配置和传输从器件地址?
问题3:
/*将方向设置为发送器*/
/*注意:可选-在 Init 中完成*/
i2cSetDirection (i2cREG1、I2C_transmitter);
i2cSetDirection API 只是 配置读/写位还是发送 读/写位?
问题4:
根据 I2C 协议,通信序列是
1) 1)启动条件
2) 2)发送从器件地址
3) 3)发送 R/W 控制位
4)数据字节
对吧?
上述代码如何遵循此通信序列?
我需要使用以下序列从 RTC 芯片中写入和读取日期和时间
写入模式:
1) 1)主器件发出"启动条件"
2) 2)主器件发出"从器件地址"、RV-3129-C3的 ACH;读/写模式的 R/W 位="0"
3) RV-3129-C3确认
4)主器件向 RV-3129-C3发送"页和字地址"
5) RV-3129-C3确认
6)主器件发出“数据”以写入步骤4中指定的地址)
7) 7) RV-3129-C3确认
8) 8)步骤6)和7)可在必要时重复。 在同一存储器页面中、RV-3129-C3将会
自动递增字地址
9) 9)主器件发出"停止条件"
读取模式:
1) 1)主器件发出"启动条件"
2) 2)主器件发出"从器件地址"、RV-3129-C3的 ACH;读/写模式的 R/W 位="0"
3) RV-3129-C3确认
4)主器件向 RV-3129-C3发送"页和字地址"
5) RV-3129-C3确认
6)主器件发出"停止条件"
7) 7)主器件发出"启动条件"
8) 8)主器件发出“从器件地址”、针对 RV-3129-C3的 ADH;针对读取模式的 R/W 位=“1”
9) 9) RV-3129-C3确认:
此时、主器件变为接收器、从器件变为发送器
10) 10) RV-3129-C3从步骤4中指定的“页面和字地址”发出“数据”)
11) 11)师父的感谢:
此时,“Page & Word”地址将自动递增1
12) 12)步骤10)和11)可在必要时重复。 在同一页地址内、将显示"字地址"
自动递增
13) 13)主器件寻址为接收器、可通过在上不生成一个确认来停止数据传输
从发送器发送的最后一个字节。 在这种情况下、必须使用从发送器
将数据线保持在高电平,使主器件能够生成“停止条件”
14) 14)主器件发出"停止条件"
您是否有用于连接 RTC RV-3129-C3的 MS570LC4357的示例代码来设置日期和时间并读回它们?