重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
void SpiWriteRegister (uchar reg, uchar value)
成都一家集口碑和實力的網(wǎng)站建設服務商,擁有專業(yè)的企業(yè)建站團隊和靠譜的建站技術(shù),十年企業(yè)及個人網(wǎng)站建設經(jīng)驗 ,為成都上千客戶提供網(wǎng)頁設計制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設等服務,包括成都營銷型網(wǎng)站建設,品牌網(wǎng)站建設,同時也為不同行業(yè)的客戶提供網(wǎng)站設計、成都網(wǎng)站設計的服務,包括成都電商型網(wǎng)站制作建設,裝修行業(yè)網(wǎng)站制作建設,傳統(tǒng)機械行業(yè)網(wǎng)站建設,傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設。在成都做網(wǎng)站,選網(wǎng)站制作建設服務商就選成都創(chuàng)新互聯(lián)公司。
{
RF_NSEL = 0; // 片選拉低啟動SPI通訊
SPI0DAT = (reg|0x80); // 寫入1個字節(jié)的寄存器地址
while( SPIF == 0); // 等待SPI傳輸完成
SPIF = 0;
SPI0DAT = value; // 繼續(xù)寫入第二個字節(jié)(寄存器值)
while( SPIF == 0); // 等待SPI傳輸完成
SPIF = 0;
RF_NSEL = 1; // 片選拉高結(jié)束SPI通訊
}
//-----------------------------------------------------------------------------
//函數(shù)描述: SPI讀取函數(shù)
//相關參數(shù):
//返回信息:
//
//-----------------------------------------------------------------------------
uchar SpiReadRegister (uchar reg)
{
RF_NSEL = 0; // 片選拉低啟動SPI通訊
SPI0DAT = reg; // 寫入1個字節(jié)的寄存器地址
while( SPIF == 0); // 等待SPI傳輸完成
SPIF = 0;
SPI0DAT = 0xFF; // 寫一個Dummy字節(jié)(因為要讀取的話必須用寫入來啟動一個交換數(shù)據(jù)的傳輸),當寫入完成后從機的數(shù)據(jù)也完成了讀入。
while( SPIF == 0); // 等待SPI傳輸完成
SPIF = 0;
RF_NSEL = 1; // 片選拉高結(jié)束SPI通訊
return SPI0DAT; // 返回讀取的值(在SPI0DAT=0xFF中完成讀取)
}
需要注意的是讀寫操作實際上完成的都是數(shù)據(jù)的交換,即主機傳送1個字節(jié)給從機,從機同時傳送1個字節(jié)給主機。所以讀操作看起來像是寫數(shù)據(jù),但實際上寫入完成后就可以從SPI0DAT中獲得從機的應答數(shù)據(jù)了。
很多人關注起Python就是因為簡單易懂,做Web很方便。但在深入CS學科的很多高級主題時,Python能發(fā)揮出更加強大無比的力量。而這來自于Python是個好膠水。
坦白講,Python不算最好的膠水,至少Lua做膠水就比Python好,API好用。但Python再算上強大的標準庫、數(shù)據(jù)結(jié)構(gòu)、友好的轉(zhuǎn)義后,就脫穎而出了。
在科學計算領域,NumPy和SciPy的存在解放了很多人的思想束縛。其底層C模塊,性能一流。
而當你需要一流的性能與一流的可調(diào)試性時,Python C模塊是最好的選擇。封裝雖然有些麻煩,但封裝后可以在Python里調(diào)用實在太方便。一些已有的C/C++應用也可以通過將函數(shù)封裝給Python調(diào)用,而極大的降低調(diào)試難度,提升單元測試覆蓋率。
2007年時我開始學Python的C模塊編程,并在博客中放出了我的筆記。那時寫了不少東西。封裝libpcap后,做網(wǎng)絡抓包,通信劫持,使得別人眼里,我儼然是個正經(jīng)黑客。后來迷戀erlang期間,做了C node的Python封裝,使得Python與Erlang可以互發(fā)消息,組建集群。搞硬件開發(fā)期間,封裝了Cubieboard和RaspberryPi的GPIO、SPI等眾多外設的Python接口,調(diào)試速度快到了云邊。做USB通信期間,因為PyUSB不支持isochronous通信而自己重寫了個libusb的Python封裝,使得USB編程不再困難。做音視頻識別的日子里,做了v4l2的Python封裝,使得操作攝像頭的控制精度達到了最高。
相比于其他人,用上這些Python封裝后,迭代速度數(shù)十倍的提高帶來了系統(tǒng)進化速度的極大提高。比如我在音視頻識別的研究期間,因為NumPy和我自己的封裝,每天動則十幾次甚至幾十次的迭代,優(yōu)化算法的各種參數(shù)。使得我在不到兩年時間里,識別效果就超過可某大學教授12年的研究成果。識別速度更是超出對方兩個數(shù)量級。
對于各個領域的研究者,我是真心推薦Python的。用上NumPy和SciPy,你就擁有了極致的性能,頂級的可調(diào)式性,和產(chǎn)品級的穩(wěn)定性。而這也使得Python的這套組合成為科學計算領域唯一能與matlab競爭的選擇。
//*****************************************************************************************
//函數(shù)名:SpisendByte(INT8U dat)
//輸入:發(fā)送的數(shù)據(jù)
//輸出:無
//功能描述:SPI發(fā)送一個字節(jié)
//*****************************************************************************************
INT8U SpiTxRxByte(INT8U dat)
{
INT8U i,temp;
temp = 0;
SCK = 0;
for(i=0; i8; i++)
{
if(dat 0x80)
{
MOSI = 1;
}
else MOSI = 0;
dat = 1;
SCK = 1;
_nop_();
_nop_();
temp = 1;
if(MISO)temp++;
SCK = 0;
_nop_();
_nop_();
}
return temp;
}
//*****************************************************************************************
//函數(shù)名:void RESET_CC1100(void)
//輸入:無
//輸出:無
//功能描述:復位CC1100
//*****************************************************************************************
void RESET_CC1100(void)
{
CSN = 0;
while (MISO);
SpiTxRxByte(CCxxx0_SRES); //寫入復位命令
while (MISO);
CSN = 1;
}
//*****************************************************************************************
//函數(shù)名:void POWER_UP_RESET_CC1100(void)
//輸入:無
//輸出:無
//功能描述:上電復位CC1100
//*****************************************************************************************
void POWER_UP_RESET_CC1100(void)
{
CSN = 1;
halWait(1);
CSN = 0;
halWait(1);
CSN = 1;
halWait(41);
RESET_CC1100(); //復位CC1100
}
//*****************************************************************************************
//函數(shù)名:void halSpiWriteReg(INT8U addr, INT8U value)
//輸入:地址和配置字
//輸出:無
//功能描述:SPI寫寄存器
//*****************************************************************************************
void halSpiWriteReg(INT8U addr, INT8U value)
{
CSN = 0;
while (MISO);
SpiTxRxByte(addr); //寫地址
SpiTxRxByte(value); //寫入配置
CSN = 1;
}
//*****************************************************************************************
//函數(shù)名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
//輸入:地址,寫入緩沖區(qū),寫入個數(shù)
//輸出:無
//功能描述:SPI連續(xù)寫配置寄存器
//*****************************************************************************************
void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
{
INT8U i, temp;
temp = addr | WRITE_BURST;
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
for (i = 0; i count; i++)
{
SpiTxRxByte(buffer[i]);
}
CSN = 1;
}
//*****************************************************************************************
//函數(shù)名:void halSpiStrobe(INT8U strobe)
//輸入:命令
//輸出:無
//功能描述:SPI寫命令
//*****************************************************************************************
void halSpiStrobe(INT8U strobe)
{
CSN = 0;
while (MISO);
SpiTxRxByte(strobe); //寫入命令
CSN = 1;
}
//*****************************************************************************************
//函數(shù)名:INT8U halSpiReadReg(INT8U addr)
//輸入:地址
//輸出:該寄存器的配置字
//功能描述:SPI讀寄存器
//*****************************************************************************************
INT8U halSpiReadReg(INT8U addr)
{
INT8U temp, value;
temp = addr|READ_SINGLE;//讀寄存器命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
value = SpiTxRxByte(0);
CSN = 1;
return value;
}
//*****************************************************************************************
//函數(shù)名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
//輸入:地址,讀出數(shù)據(jù)后暫存的緩沖區(qū),讀出配置個數(shù)
//輸出:無
//功能描述:SPI連續(xù)寫配置寄存器
//*****************************************************************************************
void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
{
INT8U i,temp;
temp = addr | READ_BURST; //寫入要讀的配置寄存器地址和讀命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
for (i = 0; i count; i++)
{
buffer[i] = SpiTxRxByte(0);
}
CSN = 1;
}
//*****************************************************************************************
//函數(shù)名:INT8U halSpiReadReg(INT8U addr)
//輸入:地址
//輸出:該狀態(tài)寄存器當前值
//功能描述:SPI讀狀態(tài)寄存器
//*****************************************************************************************
INT8U halSpiReadStatus(INT8U addr)
{
INT8U value,temp;
temp = addr | READ_BURST; //寫入要讀的狀態(tài)寄存器的地址同時寫入讀命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
value = SpiTxRxByte(0);
CSN = 1;
return value;
}
我還有其他的,其實想這樣的模擬的很簡單的,網(wǎng)上也很多,我做了個點陣用SPI的方式,但是那是自帶的,
SPI協(xié)議中接收和發(fā)送數(shù)據(jù)是一體的,數(shù)據(jù)傳輸?shù)木€路為一個循環(huán)鏈路(loop).如果主機發(fā)送數(shù)據(jù)給從機,則必須從從機讀取數(shù)據(jù)(即從機也發(fā)送數(shù)據(jù)到主機).同理,如果主機讀取從機發(fā)來的數(shù)據(jù),也必須同時發(fā)送數(shù)據(jù)給從機.總之,同一個時鐘周期內(nèi),讀和寫2個操作都必須執(zhí)行.
python GPIO
1、先安裝python-dev,輸入以下指令。
sudo
apt-get install python-dev
2、安裝RPi.GPIO,依次輸入以下指令。
1)下載:$ wget
2)解壓縮:$ tar xvzf RPi.GPIO-0.5.3a.tar.gz
3)進入解壓之后的目錄 :$ cd RPi.GPIO-0.5.3a
4)啟動安裝 :$ sudo python setup.py install
3、例子:
[python] view plain copy
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# BOARD編號方式,基于插座引腳編號
GPIO.setmode(GPIO.BOARD)
# 輸出模式
GPIO.setup(11, GPIO.OUT)
while True:
GPIO.output(11, GPIO.HIGH)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
time.sleep(1)
4、執(zhí)行:
sudo python led.py
5、說明:
1)GPIO.setmode(GPIO.BOARD),采用插座引腳編號方式。
2)由于采用插座引腳編號方式,此處的11腳相當于BCM2835寄存器編號方式的引腳11。
python GPIO
1、說明:
WiringPi是應用于樹莓派平臺的GPIO控制庫函數(shù),WiringPi遵守GUN Lv3。wiringPi使用C或者C++開發(fā)并且可以被其他語言包轉(zhuǎn),例如python、ruby或者PHP等。
wiringPi包括一套gpio控制命令,使用gpio命令可以控制樹莓派GPIO管腳。用戶可以利用gpio命令通過shell腳本控制或查詢
GPIO管腳。wiringPi是可以擴展的,可以利用wiringPi的內(nèi)部模塊擴展模擬量輸入芯片,可以使用
MCP23x17/MCP23x08(I2C
或者SPI)擴展GPIO接口。另外可通過樹莓派上的串口和Atmega(例如arduino等)擴展更多的GPIO功能。另外,用戶可以自己編寫擴展模
塊并把自定義的擴展模塊集成到wiringPi中。WiringPi支持模擬量的讀取和設置功能,不過在樹莓派上并沒有模擬量設備。但是使用
WiringPi中的軟件模塊卻可以輕松地應用AD或DA芯片。