DS18B20 器件
前言
在这整理DS18B20 器件的使用情况。
手册
单线协议的层次结构
读64位光刻ROM(Read ROM)
读Lasered Rom 程序
```c
//MSB | | LSB
// 8-Bit CRC Code | 48-Bit Serial Number | 8-Bit Family Code (43h)
unsigned char readLaseredRom(volatile uint8_t *serial) {
if(reset())
return 1;
write_byte(channel, 0x33);
for(int i = 0; i<8; i++)
serial[i] = read_byte(channel);
uint8_t tmp = CheckCrc8(serial,7);
reset();
if(tmp == serial->raw[7])
return 0;
return 1;
}
```
手册中的时序
CRC8图示
CRC8实现代码
```c
// crc8(X8 + X5 + X4 + 1)
uint8_t CheckCrc8(uint8_t *dat,uint16_t len)
{
uint8_t crc = 0, i, j;
for (i = 0; i < len ; i++)
{
crc = crc ^ dat[i];
for (j = 0; j < 8; j++)
{
if (crc & 0x01) crc = (crc >> 1) ^ 0x8C;
else crc >>= 1;
}
}
return crc;
}
```
读写Memory(Scratchpad操作)
读Memory
unsigned char read_Memory( uint16_t addr,uint8_t* data,uint16_t len) {
if(reset(channel))
return 1;
// 使用 SKIP_ROM 标识,单个设备,不需要重复读取Lasered Rom,快读取速度
write_byte(0xCC); //SKIP_ROM
write_byte(0xF0); //READ_MEMORY
write_byte(addr & 0xFF); //start address low
write_byte(addr >> 8); //start address high
for(char i = 0; i < len; i++) {
data[i] = read_byte(channel);
}
reset(channel);
return 0;
}
写Scratchpad
步骤1
步骤2
步骤3
控制程序
uint8_t write_scratch(uint16_t addr,uint8_t* data,uint16_t len) {
unsigned char buf[64] = {0};
if(reset(channel)) {
return 1;
}
write_byte( SKIP_ROM);
write_byte( WRITE_SCRATCH);
write_byte( addr & 0xFF);
write_byte( addr >> 8);
for(char i = 0; i < len; i++) {
write_byte(data[i]);
}
if(reset())
return 1;
unsigned char rbuf[3] = {0};
write_byte( SKIP_ROM);
write_byte( READ_SCRATCH);
for(char i = 0; i < 3; i++) {
rbuf[i] = read_byte(channel);
}
for(char i = 0; i < len; i++) {
buf[i] = read_byte();
}
if(reset(channel))
return 1;
if(strncmp(buf,data) == 0){
write_byte(SKIP_ROM);
write_byte(COPY_SCRATCH);
write_byte(rbuf[0]);
write_byte(rbuf[1]);
write_byte(rbuf[2]);
__delay_us(850);
if(reset(channel)) {
return 1;
}
return 0;
}
return 1;
}
其他
更加复杂的使用,这里没列出来,这需要看手册。