工具与软件:
尊敬的 TI 团队:
在我们的定制电路板中、我们使用 DS9092L+ IButton 探针、 将 DS1971+F5 IButton 与 MSP432E4微控制器连接。 但是、我们在读取 IButton 的 ROM 代码时面临困难。
以下是供您参考的连接方式:
- iButton 探头:
- 绿色(数据)连接至微控制器上的 Porte - E2
- 黑色(+ve LED)连接到微控制器上的 Porte - E3
- 白色(-ve LED)连接至 GND
- 红色(接地)连接至 GND
此外、我们已连接一个4.7k Ω 电阻器、用于数据线上的上拉电阻。
我还 在下面提供了 我的微控制器程序供您参考。
#包含
// PE2和 PE3的定义
#define DQ_PIN BIT2
#define LED_PIN BIT3
#define DQ_PORT GPIOE
void delay_us (uint32_t us){
//微秒的延迟函数(近似值)
uint32_t i;
对于(i = 0;i <(us * 3);i++){
__ NOP();
}
}
// 1线复位功能
void one_wire_reset (){
DQ_PORT->DIR |= DQ_PIN;//将 PE2设置为输出
DQ_PORT->DATA &=~DQ_PIN;//将 PE2拉至低电平
delay_us (480);//延迟480us
delayus (usecs);
DQ_PORT->DIR &=~DQ_PIN;//将 PE2设置为输入
delay_us (70);//延迟70us
if (DQ_PORT->DATA & DQ_PIN){
//未检测到存在脉冲
DQ_PORT->DATA &=~LED_PIN;//关闭 LED
UARTprintf ("未检测到 IButton。\n");
}其他{
//检测到存在脉冲
dq_port->data |= LED_PIN;//打开 LED
UARTprintf ("IButton Detected.\n");
}
delay_us (410);//延迟410us
}
// 1线读取位函数
uint8_t one_wire_read_bit (){
uint8_t 位= 0;
DQ_PORT->DIR |= DQ_PIN;//将 PE2设置为输出
DQ_PORT->DATA &=~DQ_PIN;//将 PE2拉至低电平
delay_us (6);//延迟6us
DQ_PORT->DIR &=~DQ_PIN;//将 PE2设置为输入
delay_us (9);//延迟9us
位=(DQ_PORT->DATA 和 DQ_PIN)? 1:0;//读取位
delay_us (55);//延迟55us
返回位;
}
// 1线写入位函数
void one_wire_write_bit (uint8_t bit){
DQ_PORT->DIR |= DQ_PIN;//将 PE2设置为输出
DQ_PORT->DATA &=~DQ_PIN;//将 PE2拉至低电平
if (位){
delay_us (6);//延迟6us
DQ_PORT->DIR &=~DQ_PIN;//将 PE2设置为输入
delay_us (64);//延迟64us
}其他{
delay_us (60);//延迟60us
DQ_PORT->DIR &=~DQ_PIN;//将 PE2设置为输入
delay_us (10);//延迟10us
}
}
//单线读取字节函数
uint8_t One_Wire_read_Byte (){
uint8_t i;
uint8_t byte = 0;
对于(I = 0;I < 8;I++){
byte |=(One_Wire_Read_bit ()<< i);
}
返回字节;
}
//单线写入字节函数
void one_wire_write_byte (uint8_t byte){
uint8_t i;
对于(i = 0;i < 8;i++){
ONE_WIRE_WRITE_BIT (字节和(1 << I));
}
}
//此函数用于读取 IButton 的 ROM 代码
void read_rom (uint8_t * rom_code){
uint8_t i;
One_Wire_reset ();
One_Wire_WRITE_BYTE (0x33);//读取 ROM 命令
对于(i = 0;i < 8;i++){
ROM_CODE[i]= one_wire read_BYTE ();
UARTprintf ("D[%d]:%x\n"、i、rom_code[i]);
}
}
空 main ()
{
//启用端口 E 的时钟
SYSCTL->RCGCGPIO |= SYSCTL_RCGCGPIO_R4;
//等待端口 E 准备就绪
while ((SYSCTL->PRGPIO 和 SYSCTL_PRGPIO_R4)== 0){}
//将 PE2配置为单线的双向(输入/输出)
DQ_PORT->DIR &=~DQ_PIN;//初始将 PE2设置为输入
DQ_PORT->DEN |= DQ_PIN;//为 PE2启用数字功能
//将 PE3配置为 LED 的输出
DQ_PORT->DIR |= LED_PIN;//将 PE3设置为输出
DQ_PORT->DEN |= LED_PIN;//为 PE3启用数字功能
READ_ROM (ROM_CODE);
INT I;
用于(I=0;I<8;I++)
{
UARTprintf ("D[%d]:%x\n"、i、rom_code[i]);
}
//主循环(可用于连续读取数据或处理其他任务)
while (1){
//您的主应用程序代码
}
}
请协助我们 尽快解决此问题 、以便我们能够成功读取 IButton 的 ROM 代码。
谢谢你。