中微SC8F5771模拟IIC通信——指令运行速度的探索(附编译软件与烧录软件)
文章目錄
- 一、中微單片機燒錄與使用
- 編譯軟件
- 燒錄軟件
- 下載地址
- 燒錄軟件
- 二、模擬IIC
- 三、邏輯分析儀下的時序
一、中微單片機燒錄與使用
編譯軟件
中微所使用編譯軟件為SCMCU_IDE,不過個人不推薦使用這個軟件寫代碼(十分不好用,不能跳轉,只能全部搜索一個個查,而且不能替換),大家可以利用VScode打開代碼項目文件(直接拖入桌面VScode圖標或者打開VScode再打開項目文件),VScode永遠的神。
燒錄軟件
燒錄軟件是SCMCU WRITER,買個中微的燒錄器直接接好線燒錄即可(每次編譯完會提醒你代碼改變了)
下載地址
中微官網是:https://www.mcu.com.cn(順帶提一嘴,好牛皮的域名)
進入他的支持界面,開發工具,規格書,DEMO什么的應有盡有。
燒錄軟件
在官網下載好軟件之后安裝即可,進入文件夾即可看到編譯軟件。
二、模擬IIC
雖然硬件IIC運行速度很快,但是由于單片機性能受限,并不是所有單片機都有硬件IIC,軟件IIC模擬IIC協議通信,進行讀寫操作,我以中微SC8F5771單片機為例,利用其RB0和RB1口分別作為SDA和SCL口。此處我僅給出大概模板。
void iic_init(void);//iic初始化,調GPIO,也就是選用的sda和scl口,由于最開始要輸出,所以設置為輸出模式,iic通信最開始都是高電平 void iic_deinit(void);//有初始化肯定有取消初始化,將sda和scl設置為輸入模式 void iic_write(unsigned char dev_addr, unsigned char reg_addr, unsigned char date)//iic寫入,最為關鍵的一步,把控協議主體思路 {iic_start();delay_us();write_iic_byte(dev_addr & 0xFE)//iic的地址位最后一位是讀寫方式,所以是與0xFE,如果忘了就去查一查iic_wait_ack();//等待應答delay_us();write_iicbyte(date);//地址完了就輪到數據iic_wait_ack();//等待應答delay_us();iic_stop();//一次數據寫入完成,停止通信 } void iic_start(void);//開始iic時需要scl和sda置高,然后sda拉低,表明開始,然后再scl拉低,好讓sda可以拉高或保持低作為檢測的數據。 void iic_stop(void);//停止時需要sda和scl都置高,滿足下一次通信的起始狀態 void write_iic_byte(unsigned char iic_byte)//一個很經典的寫法 {unsigned char i=8;unsigned char temp;unsigned char data;data = iic_byte;iic_sclk_clr();while(i--){temp=data>>7;data<<1;if(temp){iic_sdin_set();}else{iic_sdin_clr();}iic_sclk_set();delay_3us();iic_sclk_clr();delay_3us();} } void iic_wait_ack(void);//進行應答三、邏輯分析儀下的時序
為了讓IIC通信更快(該芯片晶振是16MHz的),為了驗證其置高低電平和nop、以及空函數調用時間,我利用邏輯分析儀,在while循環里面寫了如下代碼,觀測到的時序如圖所示。
sclk = 1;//delay_us是空的,里面什么都沒有,此處只是對比在此單片機中空函數和nop區別時間究竟相差多少delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();delay_us();sclk = 0;NOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25usNOP();//0.25us我們可以很清楚的看到高電平之后延時20個空函數,再低電平,執行20個nop指令,最終顯示一個周期內,高電平持續33us,低電平持續6.25us,后續又將20個空函數和nop改為1個空函數和1個nop,以及不加n空函數和nop的測試,可以大致得出,置一次高低電平需要2us,一個nop指令花費0.2us-0.25us,一個空函數調用大致在1.2us。
由于時間關系我并沒有去驗證太多,測出結果可能也不太嚴謹,學過匯編的同學知道,調用函數時先跳轉再返回,以51匯編為例,不同位置的函數使用對應不同的跳轉指令,范圍越大的跳轉指令耗費時間也更久,由于我是跨文件調用,應該是對應匯編中的LCALL長跳轉,并且RET返回,所以花費nop指令5-6倍的時間似乎也合理(nop本身就只占一個時鐘周期)。
以上為個人分析,無法確定其正確性,僅憑客觀數據以及主觀猜測,如有錯誤,請您指正。
非常感謝各位的觀看!
總結
以上是生活随笔為你收集整理的中微SC8F5771模拟IIC通信——指令运行速度的探索(附编译软件与烧录软件)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mediawiki mysql配置_安装
- 下一篇: 360手机助手2016年度嗨APP全民榜