欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語(yǔ)言分析I2c波形,golang i2c

使用PIC24F上的bus I2C連接6腳液晶LCD進(jìn)行顯示(主要是SDA, SCL的C語(yǔ)言編程問(wèn)題)?

i2c有現(xiàn)成的庫(kù),你在lcd的網(wǎng)站上或者是單片機(jī)網(wǎng)上可以下到,然后按照l(shuí)cd的pdf對(duì)它初始話,我給個(gè)簡(jiǎn)單的幾個(gè)函數(shù),可以實(shí)現(xiàn)初始化

成都創(chuàng)新互聯(lián)是專業(yè)的鞍山網(wǎng)站建設(shè)公司,鞍山接單;提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行鞍山網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

下面3個(gè)就是lcd的初始化配置,下面3個(gè)函數(shù)是找到的i2c庫(kù)代碼,你按照這個(gè)lcd的pdf進(jìn)行對(duì)應(yīng)的修改就行

#define pcf8576 0x70

ISendByte(pcf8576,0x48); //設(shè)置背級(jí)方式

ISendByte(pcf8576,0x70); //設(shè)置閃爍

ISendByte(pcf8576,0x60); //設(shè)置器件子地址

你可以把lcd當(dāng)成一個(gè)接口,向這個(gè)接口地址發(fā)送數(shù)據(jù)就可以讓它進(jìn)行對(duì)應(yīng)的操作,這個(gè)是我寫過(guò)的lcd顯示模塊,pcf8576是lcd的地址,這個(gè)你可以在lcd的pdf里找到

顯示的話,就是向?qū)?yīng)的lcd寄存器寫入數(shù)據(jù),比如要顯示第一個(gè)數(shù)字,就是將lcd的顯示數(shù)據(jù)里修改,然后發(fā)送顯示數(shù)據(jù)到lcd的對(duì)應(yīng)寄存器里,下面的lcdnum就是8576的顯示數(shù)據(jù)數(shù)組

void Refresh_LCD()

{

ISendByte(pcf8576,0x60);

ISendStr(pcf8576,0x00,lcdnum,9);

}

void Start_I2c()

{

SDA=1; /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/

_Nop();

SCL=1;

_Nop(); /*起始條件建立時(shí)間大于4.7us,延時(shí)*/

_Nop();

_Nop();

_Nop();

_Nop();

SDA=0; /*發(fā)送起始信號(hào)*/

_Nop(); /* 起始條件鎖定時(shí)間大于4μs*/

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0; /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */

_Nop();

_Nop();

}

/*******************************************************************

結(jié)束總線函數(shù)

函數(shù)原型: void Stop_I2c();

功能: 結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.

********************************************************************/

void Stop_I2c()

{

SDA=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*/

_Nop(); /*發(fā)送結(jié)束條件的時(shí)鐘信號(hào)*/

SCL=1; /*結(jié)束條件建立時(shí)間大于4μs*/

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SDA=1; /*發(fā)送I2C總線結(jié)束信號(hào)*/

_Nop();

_Nop();

_Nop();

_Nop();

}

bit ISendByte(unsigned char sla,unsigned char c)

{

Start_I2c(); /*啟動(dòng)總線*/

SendByte(sla); /*發(fā)送器件地址*/

if(ack==0)

return(0);

SendByte(c); /*發(fā)送數(shù)據(jù)*/

if(ack==0)

return(0);

Stop_I2c(); /*結(jié)束總線*/

return(1);

}

【原創(chuàng)】樹莓派3B開發(fā)Go語(yǔ)言(四)-自寫庫(kù)實(shí)現(xiàn)pwm輸出

在前一小節(jié)中介紹了點(diǎn)亮第一個(gè)LED燈,這里我們準(zhǔn)備進(jìn)階嘗試下,輸出第一段PWM波形。(PWM也就是脈寬調(diào)制,一種可調(diào)占空比的技術(shù),得到的效果就是:如果用示波器測(cè)量引腳會(huì)發(fā)現(xiàn)有方波輸出,而且高電平、低電平的時(shí)間是可調(diào)的。)

這里爪爪熊準(zhǔn)備寫成一個(gè)golang的庫(kù),并開源到github上,后續(xù)更新將直接更新到github中,如果你有興趣可以和我聯(lián)系。 github.com/dpawsbear/bear_rpi_go

我在很多的教程中都看到說(shuō)樹莓派的PWM(硬件)只有一個(gè)GPIO能夠輸出,就是 GPIO1 。這可是不小的打擊,因?yàn)槲蚁胧褂弥辽偎膫€(gè) PWM ,還是不死心,想通過(guò)硬件手冊(cè)上找尋蛛絲馬跡,看看究竟怎么回事。

手冊(cè)上找尋東西稍等下講述,這里先提供一種方法測(cè)試 樹莓派3B 的 PWM 方法:用指令控制硬件PWM。

這里通過(guò)指令的方式掌握了基本的pwm設(shè)置技巧,決定去翻一下手冊(cè)看看到底PWM怎么回事,這里因?yàn)闆](méi)有 BCM2837 的手冊(cè),根據(jù)之前文章引用官網(wǎng)所說(shuō), BCM2835 和 BCM2837 應(yīng)該是一樣的。這里我們直接翻閱 BCM2835 的手冊(cè),直接找到 PWM 章節(jié)。找到了如下圖:

圖中可以看到在博通的命名規(guī)則中 GPIO 12、13、18、19、40、41、45、52、53 均可以作為PWM輸出。但是只有兩路PWM0 PWM1。根據(jù)我之前所學(xué)知識(shí),不出意外應(yīng)該是PWM0 和 PWM1可以輸出不一樣的占空比,但是頻率應(yīng)該是一樣的。因?yàn)闆](méi)有示波器,暫時(shí)不好測(cè)試。先找到下面對(duì)應(yīng)圖:

根據(jù)以上兩個(gè)圖對(duì)比可以發(fā)現(xiàn)如下規(guī)律:

對(duì)照上面的表可以看出從 BCM2837 中印出來(lái)的能夠使用在PWM上的就這幾個(gè)了。

為了驗(yàn)證個(gè)人猜想是否正確,這里先直接使用指令的模式,模擬配置下是否能夠正常輸出。

通過(guò)上面一系列指令模擬發(fā)現(xiàn),(GPIO1、GPIO26)、(GPIO23、GPIO24)是綁定在一起的,調(diào)節(jié)任意一個(gè),另外一個(gè)也會(huì)發(fā)生變化。也即是PWM0、PWM1雖然輸出了兩路,可以理解成兩路其實(shí)都是連在一個(gè)輸出口上。這里由于沒(méi)有示波器或者邏輯分析儀這類設(shè)備(僅有一個(gè)LED燈),所以測(cè)試很簡(jiǎn)陋,下一步是使用示波器這類東西對(duì)頻率以及信號(hào)穩(wěn)定性進(jìn)行下測(cè)試。

小節(jié):樹莓派具有四路硬件輸出PWM能力,但是四路中只能輸出兩個(gè)獨(dú)立(占空比獨(dú)立)的PWM,同時(shí)四路輸出的頻率均是恒定的。

上面大概了解清楚了樹莓派3B的PWM結(jié)構(gòu),接下來(lái)就是探究如何使用Go語(yǔ)言進(jìn)行設(shè)置。

因?yàn)槟玫搅耸謨?cè),這里我想直接操作寄存器的方式進(jìn)行設(shè)置,也是順便學(xué)習(xí)下Go語(yǔ)言處理寄存器的過(guò)程。首先需要拿到pwm 系列寄存器的基地址,但是翻了一圈手冊(cè),發(fā)現(xiàn)只有偏移,沒(méi)有找到基地址。

經(jīng)過(guò)了一段時(shí)間的努力后,決定寫一個(gè) 樹莓派3B golang包開源放在github上,只需要寫相關(guān)程序進(jìn)行調(diào)用就可以了,以下是相關(guān)demo(pwm)(在GPIO.12 上輸出PWM波,放上LED燈會(huì)有呼吸燈的效果,具體多少頻率還沒(méi)有進(jìn)行測(cè)試)

以下是demo(pwm) 源碼

怎么從I2C總線讀數(shù)據(jù)

i2c有其協(xié)議的,我當(dāng)時(shí)從不會(huì)到掌握其協(xié)議用了一陣子,就是狂讀協(xié)議和例程

我把當(dāng)時(shí)用非斯卡爾單片機(jī)讀i2c mems傳感器的歷程寫在下面

#include hidef.h

#include "derivative.h"

#define IIC_SDA_CTL PTCDD_PTCDD1

#define IIC_SDA_DAT PTCD_PTCD1

#define IIC_SCL_CTL PTCDD_PTCDD0

#define IIC_SCL_DAT PTCD_PTCD0

#define IIC_MST_HI 0

#define IIC_MST_LO 1

void IIC_Start(void);

void IIC_Restart(void);

void IIC_Stop(void);

byte IIC_SendByte(byte);

byte IIC_Read(byte *, byte);

byte IIC_Write(byte *, byte);

void IIC_Delay(void);

void IIC_Delay(void)

{

byte i;

for (i=0;i8;i++) {}

}

//==============================================================

// Master generates a START condition on IIC bus

//==============================================================

void IIC_Start(void)

{

IIC_SDA_CTL = IIC_MST_HI;

IIC_SCL_CTL = IIC_MST_HI;

IIC_Delay();

IIC_SDA_CTL = IIC_MST_LO;

IIC_SDA_DAT = 0;

IIC_Delay();

IIC_SCL_CTL = IIC_MST_LO;

IIC_SCL_DAT = 0;

IIC_Delay();

}

//==============================================================

// Master generates a RESTART condition on IIC bus

//==============================================================

void IIC_Restart(void)

{

IIC_SDA_CTL = IIC_MST_HI; //SDA back to high while SCL remain in low

IIC_Delay();

IIC_SCL_CTL = IIC_MST_HI; //SCL back to high, bus idle now

IIC_Delay();

IIC_SDA_CTL = IIC_MST_LO; //RESTART condition occur

IIC_Delay();

IIC_SCL_CTL = IIC_MST_LO; //SCL to low for standby

IIC_Delay();

}

//==============================================================

// Master generates a STOP condition on IIC bus

//==============================================================

void IIC_Stop(void)

{

IIC_SDA_CTL = IIC_MST_LO; //make sure SDA is low

IIC_Delay();

IIC_SCL_CTL = IIC_MST_HI; //I2C_SCL_CTL go to high first

IIC_Delay();

IIC_SDA_CTL = IIC_MST_HI; //I2C_SDA_CTL have low-high transition while SCL is high

IIC_Delay();

}

//==============================================================

// Master send out a byte of data and return with ACK/NACK

// return with 0x00 if ACK received

// return with 0xff if NACK received

//==============================================================

byte IIC_SendByte(byte outDat)

{

byte bit;

//send out 8-bit data

for (bit=0;bit8;bit++) {

if (outDat0x80)

IIC_SDA_CTL = IIC_MST_HI;

else

IIC_SDA_CTL = IIC_MST_LO;

IIC_Delay();

IIC_SCL_CTL = IIC_MST_HI;

IIC_Delay();

IIC_SCL_CTL = IIC_MST_LO;

outDat = 1;

}

//check for the ACK/NACK

IIC_SDA_CTL = IIC_MST_HI; //master release SDA

IIC_Delay();

IIC_SCL_CTL = IIC_MST_HI; //master send a clock

IIC_Delay();

if (IIC_SDA_DAT) bit = 0xff; //NACK

else bit = 0; //ACK

IIC_SCL_CTL = IIC_MST_LO;

IIC_Delay();

return(bit);

}

//==============================================================

// Master write a string of bytes through IIC us

// Return with 0x00 if successful

// Return with 0xff if failed

//==============================================================

byte IIC_Write(byte *buff, byte total)

{

while (total) {

if (IIC_SendByte(*buff++)) //get NACK after data byte out

return(0xff); //abort

total--;

//__RESET_WATCHDOG(); //needed only for EEPROM byte-program

}

return(0);

}

//==============================================================

// Master read a byte of data and set ACK/NACK

// return with data read

//==============================================================

byte IIC_ReadByte(byte ackFlag)

{

byte bit, dat;

IIC_SDA_CTL = IIC_MST_HI; //make sure master release SDA

//read 8 bits sof data

for (bit=0;bit8;bit++) {

dat = 1;

IIC_SCL_CTL = IIC_MST_HI;

IIC_Delay();

if (IIC_SDA_DAT) //read back data

dat |= 0x01;

IIC_SCL_CTL = IIC_MST_LO;

IIC_Delay();

}

//echo with ACK/NACK

if (ackFlag==0)

IIC_SDA_CTL = IIC_MST_LO; //echo back ACK

else

IIC_SDA_CTL = IIC_MST_HI; //echo back NACK

IIC_Delay();

IIC_SCL_CTL = IIC_MST_HI;

IIC_Delay();

IIC_SCL_CTL = IIC_MST_LO;

IIC_Delay();

return(dat);

}

//==============================================================

// Master read a string of data bytes through IIC us

//==============================================================

byte IIC_Read(byte *buff, byte total)

{

byte count;

if (total==0) return(0);

if (total==1) { //read one byte only

buff[0] = IIC_ReadByte(1); //NACK after read

return(1);

}

else { //read more than one bytes

count = 0;

while(total1) {

IIC_Delay();

buff[count++] = IIC_ReadByte(0); //ACK after read

total--;

__RESET_WATCHDOG();

}

IIC_Delay();

buff[count++] = IIC_ReadByte(1);

return(count);

}

}

然后你去網(wǎng)上搜索iic總線協(xié)議,把協(xié)議多讀幾遍慢慢就會(huì)了~~要不你把郵箱給我我發(fā)給你.總之很簡(jiǎn)單的 不用害怕,學(xué)學(xué)就會(huì)了

網(wǎng)站標(biāo)題:go語(yǔ)言分析I2c波形,golang i2c
網(wǎng)頁(yè)URL:http://www.chinadenli.net/article10/heijgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化關(guān)鍵詞優(yōu)化營(yíng)銷型網(wǎng)站建設(shè)企業(yè)網(wǎng)站制作網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名