DS2433應用筆記

2021-08-15 00:21:00 字數 3940 閱讀 8800

最近除錯 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...