最近除錯 ds2433 晶元,由於第一次接觸1-wire匯流排,遇到了許多問題,但相關 ds2433中文資料 並不多,故作筆記總結,方便你我他。
除錯環境:keil5
硬體環境:stm32f103c8t6 + ds2433
引腳分配:
stm32<--->ds2433
pb11<--->data
gnd<--->gnd
ds2433主要特性
4096位(512位元組)eeprom。
唯一的64位註冊號。
1-wire匯流排通訊。
先看主函式:
程式結構比較簡單,初始化各個模組後,寫入一組隨機數值到ds2433,再從ds2433中讀出全部資料。當串列埠接收到任意字元後,通過串列埠將讀取到的資料傳送到上位機串列埠助手上。
int main(void)
for( i=0;i<512;i++) pagedata[i] =rand()%256;
write_test(pagedata,oid);//將pagedata寫入ds2433.
read_2433(romcode);//讀取註冊碼
for( i=0;i<512;i++) read_test[i] = 0x00;//將讀快取資料初始化0x00
read_2433_alldata(read_test); //可以讀取512個完整資料
read_2433(romcode);
while(1)
ds2433初始化
//返回1:不存在
//返回0:存在
u8 ds2433_init(void)
ds2433復位
//復位ds2433
void ds2433_rst(void)
等待ds2433響應
//等待ds2433的回應
//返回1:未檢測到ds2433的存在
//返回0:存在
u8 ds2433_check(void)
;if(retry>=200)return
1; else retry=0;
while (!ds2433_dq_in&&retry<240)
;if(retry>=240)return
1;
return
0; }
int owtouchreset(void)
1-wire寫1byte資料
// write
1-wire
data byte
void owwritebyte(int data)
}
1-wire匯流排寫1位元資料
// send a 1-wire write bit. provide 10us recovery time.
// void owwritebit(int bit)
else
}
1-wire讀取一位元組資料
// read 1-wire data byte and
return it
//int owreadbyte(void)
return result;
}
1-wire讀取1位元資料
// read a bit from the 1-wire bus and return it. provide 10us recovery time.
//int owreadbit(void)
讀取ds2433中全部資料
void read_2433_alldata(u8 *page_data) //所有儲存空間512位元組全部讀出
owwritebyte(0xcc); // send skip rom command to select single device
owwritebyte(0xf0); // read authentication command
owwritebyte(((page << 3)) & 0xff); //ta1位址低8位,左移位數與每次讀取長度相關
owwritebyte(page>>5); // ta2 位址高八位
for (i = 0; i < 8; i++) //每起始位址,連續讀8位元組
page_data[page*8+i] = owreadbyte();
if (owtouchreset()) // reset the 1-wire bus
}
向ds2433中寫入512位元組資料
void write_test(unsigned
char *page_data,u8 *oid)
owwritebyte(0xcc); // send skip rom command to select single device
owwritebyte(0x0f); // read authentication command
owwritebyte((j<<3)&0xff); //ta1
owwritebyte((j>>5)&0xff); //ta2
for (i = 0; i < 8; i++)
// select the device
if (owtouchreset()) // reset the 1-wire bus
owwritebyte(0xcc); // send skip rom command to select single device
owwritebyte(0xaa);
ta1 = owreadbyte();
ta2 = owreadbyte();
e_s = owreadbyte();
delay_us(10);
for(i=0;i<8;i++)
// select the device
if (owtouchreset()) // reset the 1-wire bus
owwritebyte(0xcc); // send skip rom command to select single device
owwritebyte(0x55); // read authentication command
owwritebyte(ta1 & 0xff );
owwritebyte(ta2); // ta2
owwritebyte(e_s);
delay_us(5000);
// select the device
if (owtouchreset()) // reset the 1-wire bus
}}
讀ds2433註冊碼
//read 2433 product code
u8 read_2433(u8 *romcode)
else
}
crc檢查
///crc check
u8 dscrccheck(u8* p,u8 len)
}return temp;
}
以上即是ds2433的驅動的核心原始碼,主要依據資料手冊相關時序與指令完成。
需要注意的小問題是,手冊中關於ds2433的儲存位址存在筆誤,末page頁面位址應為0x01fe-0x01ff,而文件中為0x1fe0-0x01ff。
在除錯成功後發現其實很簡單,但在除錯時遇到許多坑,但主要集中在對文件的不夠熟悉,特別是位址和偏移量的換算。使用隨機變數讀寫ds2433,便於檢查寫入與讀出的資料是否一致,據此判斷讀取函式是否出現了問題。
詳細使用可根據以上驅動函式靈活組合,實現具體應用。
OpenCV應用筆記
1 使用cvsmooth函式,src與dst的depth要一致,否則會出現raiseexception錯誤。src和dst的位深不能為64位浮點。簡單模糊和高斯模糊支援 1 或 3 通道,8 位元 和 32 位元 浮點影象。這兩種方法可以 in place 方式處理影象。2 關於直接讀取iplima...
session應用筆記
session start 開始session會話處理 session只要用到這個,就必須開啟session start 放在檔案開頭 建立session,直接採用超級全域性變數賦值即可 session是存在伺服器端,一般存放1440秒,如果網頁沒有任何操作,會自動銷毀,當然,可以通過php.ini...
sed 應用筆記
sed 的筆記 sed 的替換指令 有兩款。分別如下 第一款 sed i s g 第二款,帶有 可以出現 在 的前面或者後面。sed i s g 假設 etc sysctl.conf檔案上,有如下的 指令。都替換為net.ipv4.tcp sack 0。net.ipv4.tcp sack 1 net...