2017年6月26日 星期一

ESP8266 ESP-01 WiFi 模組

術語與縮寫

WiFi

Wireless Fidelity

UART


Universal Asynchronous Receiver & Transmitter

P2P


Point to Point

TCP

Transmission Control Protocol

IP

Internet Protocol

WPA

WiFi Protected Access

WPS

WiFi Protected Setup



ESP8266/ESP-01 簡介



ESP8266 是低功耗的 UART-WiFi 透傳模組,特色是體積小而且低功耗,適用移動裝置或物聯網的設計,可將嵌入式的裝置連到 WiFi 無線網路,進行 Internet 或 LAN 通訊,實現聯網功能。

Features 特色


支援無線 802.11 b/g/n 標準
支援 STA/AP/STA+AP 三種工作型態
內建 TCP/IP stack,支援多路 TCP Client 連線
支援 Socket AT 指令
支援 UART/GPIO
3.3V 單電源供應

主要功能

ESP8266可以實現的主要功能包括:串列埠透傳,PWM 調控,GPIO控制。

串列埠透傳:資料傳送,傳送的可靠性好,最大的傳送速率為:460800bps。
PWM 調控:燈光調節,三色LED 調節,電機調速等。
GPIO控制:控制開關,繼電器等。

工作型態


電腦用 COM port 與 ESP8266 模組連接,透過 UART 兩者之間通訊。由電腦端可以發送 AT command 進行設定。ESP8266 預設的 baudrate 為 9600,8,n,1。

ESP8266模組支援 STA/AP/STA+AP 三種工作型態。

STA 型態:ESP8266模組通過路線器連線互聯網,手機或電腦通過互聯網實現對裝置的遠端控制。
 AP 型態:ESP8266模組作為熱點,實現手機或電腦直接與模組通訊,實現區域網路無線控制。
 STA+AP 型態:兩種型態的共存型態,即可以通過互聯網控制可實現無縫切換,方便作業。


測試方法



電腦和手機端要當作伺服器端(SERVER),讓模組作為客戶端(CLIENT)發送請求連線與進入通訊埠(PORT),需要下載 TCP 的除錯軟體。也要將模組切換 STA/AP,以做 server/client 之間的切換。



Fig.1 系統架構圖

1. ESP8266 模組當作 Server ,PC 當作 Client:
將模組用 AT command 設定為 AP 型態,用PC連上 ESP8266 模組的 WiFi ,並在 PC 端開啟 TCP 測試的應用程式,連接ESP8266的 IP 位址和通訊埠。

2. PC 當 Server,ESP8266 當 Client:
在 PC 端開啟 WIFI熱點,讓模組可以連入。在電腦端使用 TCP/IP server 的應用程式建立 Server,等待模組連線至電腦的熱點,連上WIFI熱點並取得 IP後,模組使用 CIPSEND的指令進入傳透模式,將被傳送的資料寫入模組的 UART port 即開始傳送資料,可以在這裡建立使用者互相通訊的模式。

3.手機端當作 server ,ESP8266 當 Client:
與第二點相同,用手機開啟 TCP的應用程式,等待模組的連入並建立連線。


透傳型態測試


大致上模組進行連線通訊的流程

供電並致能以後,執行 AT 指令

AT+CWMODE=3
AT+RST

AT+CIPMODE=1 //設定透傳型態

// 模式可以設定後,連上AP點的網路,開啟TCP連線


AT+CWLAP                            //列出目前可用的AP點
AT+CWJAP=“SSID”,”PWD” //加入指定的 AP

/*  連上WIFI,有網路以後就可以做為 Client 連上 TCP Server,相反的模組也可以自己當 server  */

AT+CIFSR                               //抓取IP位址,檢查是否連接到 IP

AT+CIPSTART=“TYPE”,”ADDR”,”PORT”
 //建立TCP/UDP連線,指定 Server 的 IP 位址,和通訊埠


AT+CIPSTATUS


AT+CIPSEND //開始傳送,CIPMODE=1並且作為用戶端,進入透傳型態

AT+CIPSEND=<LENGTH>  //LENGTH 決定要傳送的 Bytes 數



建立 TCP SERVER


AT+CIPMUX=1
AT+CIPSERVER=1

只要兩行指令就將伺服器建立起來了,這時候會不知道 SERVER 的 IP 位址是多少,可以再用 CIFSR 來看,預設的通訊埠為 333。

所以在將 server 建立之前先設定 STA使用的 IP位址,在 server 建立的同時設定通訊埠。

AT+CIPSTA_CUR="192.168.94.87"
AT+CIPMUX=1
AT+CIPSERVER=1,9487

AT+CIFSR  //查看 IP 及 STAIP,MAC
AT+CIPSTA_CUR?  //查看 STAIP, Gateway



2017年6月20日 星期二

typedef的用法

typedef 與 #define 類似,但是 #define 是做字串直接的替換,typedef 像是幫型態類別重新取名。

typedef
1.一次宣告多個指標型態的物件
2.typedef 用在 struct,以往每在宣告 struct 的新物件時,都要帶上 struct
3.用 typedef 來定義與平台無關的型態
4.為複雜的宣告定義一個新的簡單的別名



1.不僅僅是簡單的替換。可以作為同時宣告多個指標的物件。
char* pa, pb;

typedef char* PCHAR;
PCHAR pa, pb;


#define char* PCHAR
PCHAR pa, pb;
//實際上變成只有 pa 是指標型態
//char* pa; char pb;


2.

struct tagPOINT1
{
int x;
int y;
};

struct tagPOINT1 p1;

- - - - - - -

typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1;

3.

typedef int number_max;

有個變數只用來存 2 byte的大小,想要換平台,改用更大的型態,這樣原本宣告的新名稱不用變動。

typedef DWORD number_max;


4. 複雜宣告的簡化

void (*b[10])(void(*)());

typedef void(*pFunParam)();
typedef void(pFunx)(pFunParam);

簡化後
pFunx b[10];



2016年4月20日 星期三

學習筆記 MODBUS

MODBUS Application Protocol

Application Layer Messaging Protocol

是應用層的通訊協定,提供 Client/Server 通訊在兩個裝置或網路之間。一般用在 Serial Line 的傳輸上面,後來也有發展出 TCP/IP 的應用。

在1979年創立的標準,為 de facto 工業標準,常用在各種自動化設備之間的通訊。

MODBUS 是 Request/Reply Protocol ,答詢模式的協定,利用 Function Code 指定不同的行為。 Function Code 是組成 PDU的要素,用來建立架構進行 MODBUS 的 Transaction

MODBUS Communication Stack


Example of MODBUS Network Architecture

MODBUS 透過 Gateway 可用在不同網路間的連接,一對一的連接可以用 RS232,一對多用RS485,有多個 Client 可用 TCP/IP, Gateway 可用來做封包的轉送用來連接的不同類型的網路。

HMI:人機界面, PLC:邏輯控制器

 MODBUS Protocol Description

PDU( Protocol Data Unit)獨立於底層的通訊層,與傳遞的方式無關,PDU 被用來指定封包的功能和MODBUS SLAVE 的行為。

ADU( Application Data Unit)用來指定到不同的匯流排(buses)或網路,定址到某個 BUS上的指定的 Slave Address。

Address 的內容為一個 byte,定址的使用範圍從0到255,0為廣播位址(broadcast),1到127一般可用位址,128到255保留。通常 MODBUS Address 在裝置上事先分配好了,也可以由自己設定想要的 slave address。





MODBUS Slave device 

Delta(台達電子) 

在 MODBUS 網路上以Master/Slaver架構運作,除了Master裝置以外其餘的一個或多個設備皆為 Slave Device,也就是在MODBUS的網路上,只會允許一個Master裝置的存在,這是在spec終究規範好的,否則的話如果有兩個master同時發出request的訊號,會造成網路上的衝突,發生不可預期的反應。

PLC ( Programmable Logic Controller)
可程式邏輯控制器

PC可以用 RS232 或 RS485 與PLC相連進行設定和編程,預設通訊格式為 (ASCII, 9600, 7, E, 1),與PC相連時,PC 端為 Master 而 PLC 端為 Slave。

載入程式後,PLC透過設定好的程式,PLC 端主動或被觸發動作產生 MODBUS 的指令傳送給 BUS 上的某個 MODBUS Slave。


TC ( Temperature Controller)
溫度控制器

在 MODBUS 上作為 MODBUS Slave 的角色



學習筆記 UART PC16550D Universal Asynchronous Receiver/Transmitter

UART

UART(Universal Asynchronous Receiver/Transmitter)
通用非同步接收發送機,是硬體的一部分,將資料由序列通訊與並列通訊作傳輸轉換。UART通常用在與其他通訊界面的連接上,如RS232、RS485。

是對應各種非同步串行通信口的接口標準和匯流排標準,它規定了通信口的電氣特性、傳輸速率、連接特性和接口的機械特性等內容。

實際上是屬於通信網路中的實體層(Physical Layer)的概念,即電氣特性,與通信協定沒有直接關係。而通信協定,是屬於通信網路中的資料鏈結層(Data Link Layer)的概念,規範了被傳送資料的格式。

COM 是 PC(個人計算機)上,非同步串行通信口的簡寫。由於歷史原因,IBM的PC外部接口配置為RS232,成為實際上的PC界默認標準,最早就是由 IBM 所使用,所以後來繼續沿用,現在 PC 機的 COM 均為 RS232。若配有多個非同步串行通信口,則分別稱為COM1、COM2... 。在裝置管理員中可以找到。


與同步傳輸的差異在於 Clock 信號的有無,在傳遞訊號時會用起始位元來表示資料訊框的開始,以結束位元當作資料的終止,結束位元可能會有不同個數的選擇,則依據不同的鮑率需要選擇不同的結束位元數目,一般以資料傳輸位元在小於4%的畸變的考量下去決定最高的鮑率和結束位元數目。

USART
在 UART 上追加同步方式。

PC16550D

TI(Texas Instruments, 德州儀器)的 UART晶片,帶有FIFO功能。


UART演進

16550 可以選擇是否要ENABLE FIFO,切換有無FIFO的模式。Mode 16450和 Mode FIFO,在1645並沒有FIFO的功能。 16550加了FIFO,有16 bytes 緩衝,即深度16 bytes,寬8 bits。
(資料來源:wiki )

Basic Configuration

用在 CPU BUS和通訊界面之間互相的連接,此處的 DATA BUS為 8 bits的匯流排,為 Intel 8086/8088(16位元CPU)所使用,利用 8 bits BUS  並列讀寫 D0 到 D7 八個位元,將串列換成序列資料到傳輸介面。

相對來說,8 個位元的並列傳輸要傳輸 8 bits 的資料只需要一個 tick 的時間,串列傳輸卻需要重複傳輸八次,需要八倍的時間也就是八個 tick 的時間,光是效率上就差了八倍。但是就距離而言,串列傳輸的傳送長度比並列傳輸要大得多,因為在並列傳輸上,每條信號線到達目的端時間點可能不同,或者有不同的相位差,造成信號的偏差,所以一般並列式傳輸的距離較短。

圖中 EIA-DRIVERS 可以為 RS232或RS485 由DRIVER的類型決定,DRIVER晶片轉換PC16550D的 TTL 電壓到interface對應的電壓範圍進行通訊。

PC16550D腳位

資料傳輸

D0-D7 並列 資料(parallel)
SIN串列資料(serial)
SOUT

WR/RD 讀寫控制(PIN方向)

晶片選擇

CS0/CS1/CS2
有三條線,代表最多可以有2的3次方,即8個不同裝置


MODEM控制

RI (鈴聲指示)
DCD(載波偵測)
DSR
CTS(清除以傳送)
DTR
RTS(準備傳送)

現在通常已經沒有一定要實作的必要,但是都會保留下來。還是可以當作判斷有沒有在進行通訊中。

中斷信號

INTR

DMA信號

TXRDY
RXRDY


Register 位址選擇

A0/A1/A2
ADS

Address 就根據 IO base加上相對的暫存器位置。


PC16550D Function Block Diagram

左邊區塊為晶片的邏輯控制,Register Address 的選擇和讀寫的控制。

中間為 Register 的種類,如 Line Control, Divisor Latch, Modem Control, Interrupt Enable, FIFO Control 控制類型的,和狀態讀取的 Line Status, Modem Status, Interrupt ID,還有接受和傳送用的Register, Receiver Buffer, Transmitter Holding。 

右上接收的移位暫存器,接收完畢後送到Receiver Buffer 然後Data Ready旗標 ,右中為傳送的移位暫存器,







各暫存器(Register)種類

利用 Address Line 可以定址到不同 Register 進行讀寫,如 address 0 同時是接收(RBR)和發射(THR)的暫存器,可是進行 Read 和 Write 不同行為,卻是對應到兩個不同暫存器。還有另一個位元 DLAB為1時,定址到 address 0 也會對應到不同暫存器 Divisor Latch(LS,MS)。在最一開始設定暫存器時,需要注意當時寫入的是哪個暫存器。

以下是各暫存器內容



Registers Addressing






中斷(INTERRUPT)控制

當有中斷信號產生時,原本執行中的行程被中斷,必須要處理中斷服務常式內的程序,等到 ISR 執行完後返回原本中斷的地方,繼續當初正在執行的動作。


當各種 interrupt 有被致能時,只要對應的 Register 行為產生,INTR pin就會發出 interrupt信號,譬如說 Receiver Buffer Register 接收滿了,對應的 Interrupt Data Ready(DR) 中斷信號就會產生。

由於晶片上只有一個 INTR 的腳位,只要有任何中斷信號發生,INTR pin 信號就會舉起,等等待 CPU 執行對應的動作 INTR 電壓準位才會降下,像是讀取 RBR,硬體動作就會自動將 INTR 內容清除為 0。為了知道中斷信號產生時,這個信號是從誰而來,每個中斷信號會分到不同的優先權等級,代表不同類型的行為。

分成四個等級,如接收錯誤、接收完成、發送、MODEM控制。


























2015年12月21日 星期一

Windows 語言列消失

對工具列按右鍵 > 工具列(T) > 新增工具列(N)

在資料夾列打入 C:\Windows\System32\ctfmon.exe





或是到資料夾中直接找到 ctfmon 開啟。

就會在工具列多出語言列了




2015年12月20日 星期日

MPC4812 DAC晶片 Microchip Mixer 混波器 (SPI)

MCP4812簡介

10 bits 的 DAC chip,支援SPI通訊協定的傳輸; 使用 Microchip 提供的API 將 ADC 已經儲存在 dsPIC Register 內的 Digital Value 經由 SPI 傳送到 DAC 的 Register 內輸出。

最高時脈支援到 20 MHz


Features

• MCP4812: Dual 10-Bit Voltage Output DAC
  雙通道,10bit 解析度的電壓輸出,數位轉類比

• Rail-to-Rail Output

• SPI Interface with 20 MHz Clock Support
  支援 SPI 到 20MHz 的時脈

• Simultaneous Latching of the Dual DACs with LDAC pin
  LDAC腳位可以對DAC進行鎖存

• Fast Settling Time of 4.5 μs

• Selectable Unity or 2x Gain Output

• 2.048V Internal Voltage Reference

• 50ppm/°C VREF Temperature Coefficient

• 2.7V to 5.5V Single-Supply Operation

• Extended Temperature Range: -40°C to +125°C

Package Types

腳位圖,將MCU dsPIC 設定好 SPI 參數並且enable 連線到,有 SCK/SDO,做DAC只需要給他輸入就好了,所以MCU那端不需要 SDI。 












MCP4812 Block Diagram

可以看到內部的 register , Data 從 SDI進入以後到 input Register ,  經過 LDAC 鎖存控制才能到下一層 DAC Register,經過參考電壓轉換到該電壓準位,經由Output OP AMP 輸出。

腳位描述

Supply Voltage Pins (VDD, VSS)


VDD是供應電源的腳位,正電壓可從 2.7V到5.5V

VSS類比腳位的接地要盡量避免雜訊,使DAC有較好的表現

可以使用適當的旁路(bypass)電容接地,避免高頻的雜訊

Chip Select (CS)

選擇晶片的腳位

Serial Clock Input (SCK)

SPI 的序列時脈輸入腳位

Serial Data Input (SDI)

SPI 的序列資料輸入腳位

Latch DAC Input (LDAC)

DAC的資料鎖存,用來同步DAC資料的輸出,當此腳位致能時,才能輸出DAC
使用上可以 always enable

Analog Outputs (VOUTA, VOUTB)

類比輸出的腳位,根據控制位元的設置和參考電壓會輸出DAC的電壓訊號

ANALOG OUTPUT VOLTAGE (VOUT)

WRITE COMMAND REGISTER FOR MCP4812 (10-BIT DAC)


Write Command for MCP4812 (10-bit DAC)

使用 SPI 時,需要注意設定SCK Clock的模式,需要知道 Slave的模式為何,Master/Slave 的 Clock 的模式相同兩邊才能通訊。

SPI 傳送每個 Frame ,第一個 character 的 MSB 四個 bits 用來當 configuration。e.g. 0001= A通道,兩倍輸出,運作狀態。反之 Bit12為0時,為 output shutdown。 











2015年12月19日 星期六

dsPIC 33F系列DSP 使用內建 ADC輸入模組 透過 SPI 協定傳輸至 MCP4812 DAC 晶片輸出

開發目標:

使用dsPIC33F 的 ADC(模數轉換),輸入的訊號源用訊號產生器產生一個 SINE 的電壓波形,在電路板上經連線輸入到 dsPIC33F chip 的ADC Pair0 (AN0, AN1) 輸入 pin 腳在 IC 的內部進行取樣,在 dsPIC 的ADC模塊裡面將原來的電壓訊號經過取樣保持和轉換後將輸入的電壓取樣成轉化 digital (數位)的值(10 bits)位元數為十,再將此數值儲存在 dsPIC33F 內部的 Register (16 bits) 中。之後便可從記憶體中取出此數值。

將 dsPIC33F ADCBUF 中的取樣值利用 SPI 傳輸協定 (SPI 為晶片上常見的通訊協定) 將資料傳送到另一個 DAC的晶片(MCP4812) ,在 DAC 的輸出端 pin 腳輸出電壓波形,此波形將還原成SINE 的電壓波形,解析度由暫存器內的數值決定。

dsPIC Function Block Diagram

dsPIC 包含 MCU 大部分具備的功能,這裡用到 ADC 和 SPI 模組,ADC 搭配 Timer 做 trigger。



ADC Initialization 初始化設定

初始化 (Initialization) 時,設定與 ADC 相關的暫存器,寫入設定時,要將 ENABLE的位元關閉(bit 設置為0),暫存器寫入各項設定完成後,才將 ENABLE bit 寫入成高位元使其致能。 選好要開啟的輸出入 pin 腳要記得設定成輸入或輸出,例如使用 AN0 輸入就要設定 pair0 和 TRIS方向和類比腳位。

會用到的如 ADC存入的格式,FORM會有兩種:整數和分數。由於暫存器是16位元的,所以區分方式就用存在前後 10 bits 來做區分。整數就是存在後面(LSB)十個位元,分數的方式是以Q15的格式,然後存在高(MSB)十位元。

還有與 ADC 相關的時脈 (clock) 設定,選擇 converter 的時脈來源 (Clock Source) 和分頻,每次的取樣保持轉換過程,根據 datasheet 上的描述,要 14 個 ADC 的週期才會完成一次完整的取樣轉換。由此可知從時脈計算出來的轉換需要多少的時間可以完成,去調整取出 ADC 資料的頻率。

最後一項是 ADC Trigger Source 的設定,就是選擇由何種行為來觸發每次的 ADC 取樣,常用的如 PWM 波形, Timer, 除了用硬體的方式觸發也可以用軟體中斷來觸發。

void init_ADC(void){

ADCONbits.FORM = 0;  
//0為整數,1為分數
//選擇轉換成數字的格式

ADCONbits.EIE = 0;              //Early Interrupt disabled
ADCONbits.ORDER = 0;       //Convert even channel first
ADCONbits.SEQSAMP = 0;  //Select simultaneous sampling

/*ADC的時脈*/
ADCONbits.ADCS = 5;
//ADC clock = FADC/6 = 120MHz / 6 = 20MHz
/* Tad = 1/ADC clock 轉換1次要 14*Tad = (ADC clock/14) */        
// 控制 ADC clock 的分頻,由Tc 取得 主 clock後轉換成 ADC 的 clock 當TADC


/*使用an0取樣*/
ADPCFGbits.PCFG0 = 0;  //select CH0 as analog pin 
ADPCFGbits.PCFG1 = 0;  //select CH1 as analog pin

/*中斷設置*/
IFS6bits.ADCP0IF = 0;       //Clear ADC Pair 0 interrupt flag 
IPC27bits.ADCP0IP = 5;     //Set ADC Pair 0 interrupt priority
IEC6bits.ADCP0IE = 1;      //Enable the ADC Pair 0 interrupt

ADSTATbits.P0RDY = 0;   //Clear Pair 0 data ready bit
ADCPC0bits.IRQEN0 = 1;  //Enable ADC Interrupt pair 0 

/* 用Timer triggle ADC 觸發完才進行下次轉換*/
/*觸發源設置 Timer1 */
ADCPC0bits.TRGSRC0 = 12; //ADC Pair 0 triggered by Timer1 

}


ADC Clock Source Select

figure 1. Auxiliary Clock Generation

FRCSEL / ENAPLL / SELACLK / APSTSCLR Control Bits

上述這些位元決定輔助時脈 (ACLK) 的來源和分頻,給出最後的時脈 (clock) 進入到 ADC模組使用後再分頻。

ACLKCONbits.FRCSEL = 1;        // FRC provides input for Auxiliary PLL (x16)  
ACLKCONbits.SELACLK = 1;     // Auxiliary Ocillator provides clock source forADC  
ACLKCONbits.APSTSCLR = 7;   // Divide Auxiliary clock by 1  
ACLKCONbits.ENAPLL = 1;       // Enable Auxiliary PLL  

Final Output ACLK to ADC:
ADC Aux Clock = 7.37*16/1 = 120 MHz

Timer1 Triggle setup

void init_Timer1(void)
{
    T1CONbits.TON=0;
    T1CONbits.TSIDL=0 ;
    T1CONbits.TGATE=0;
    T1CONbits.TCKPS=0;   //Timer1分頻選擇
    T1CONbits.TCS=0;        // Timer Clock Source Select bit,Internal clock (FOSC/2)

    TMR1=0x00;
    /*修改PR1*/
    // 40M/250 = 160 kHz ;  Triggle period time = 6.25us
    PR1=248;  //Timer interrupt=FCY/TCKPS/PRn+1

    /* Timer interrupt setup */
    IPC0bits.T1IP= 0x01;
    IFS0bits.T1IF= 0;
    IEC0bits.T1IE= 1;
}

Fcy select source 系統頻率(FCY)的來源

根據下圖提供的資訊去設定系統要用的時脈來源 (Clock Source),選擇哪種振盪器 (Oscillator) 和有沒有鎖相迴路 (PLL) 倍頻,設定分頻,可以計算出最後的 Fcy 和 Fosc 。


FRC Oscillator / FRCCLK / FRCDIC / FRCDIV<2:0> / FRCDIVN




Source(Internal RC) /  PLLPRE / PLLDIV / PLLPOST









根據上面兩張圖提供的資訊,選擇 system oscillator source ,設定 PLL的分頻的 M 和 N 值,及分頻的大小,計算出 Fcy 和 Fosc 。

_FOSCSEL(FNOSC_FRC);  //Internal Fast RC (FRC) oscillator
_FOSC(FCKSM_CSECMD & OSCIOFNC_ON)
/* Clock Switching and Monitor */
//FCKSM_CSECMD : Clock switching is enabled, Fail-Safe Clock Monitor is Disabled
/* OSC2 Pin Function */
//OSCIOFNC_ON : OSC2 is general purpose digital I/O pin

PLLFBD=41; // M = PLLFBD + 2  
CLKDIVbits.PLLPOST=0;   // N1 = 2  
CLKDIVbits.PLLPRE=0;     // N2 = 2  

最後 Fosc 除以2 即 Fcy 。
Final Fcy:
Fcy = (7.37*43/2/2)/2 = 40 M

Timer select source

新增說明文字
TCKPS / TGATE / TCS 

T1CONbits.TCKPS=0;   //Timer1分頻選擇
T1CONbits.TGATE=0;
T1CONbits.TCS=0;        // Timer Clock Source Select bit,Internal clock (FOSC/2)


ADC Calculate


 取樣 / 保持過程




取樣轉換完成需要 14*Tad

/*ADC的時脈*/
ADCONbits.ADCS = 5;
//ADC clock = FADC/6 = 120MHz / 6 = 20MHz ; Tad = 0.05us
/* Tad = 1/ADC clock 轉換1次要 14*Tad = 0.7us ; 做完一次ADC的頻率 Fad = 1428 kHz */    


SPI初始化

SPI 根據 Clock 的類型分成四種 Mode , 以正/負緣觸發和由高/低電位不同做區分。

設定 SPI 的 clock 由 Fcy 取得做分頻, dsPIC33F SPI 模組支援到 20 MHz。

SPI 傳輸的模式有分 8 bits 和 16 bits。


//here is the SPI setup for 20 MHz operation, Mode 0,0.
{
          
  //PLLFBD = 41;                
  //CLKDIV = 0x0040;  //將主clock 移到main前面作設置
            
SPI1CON1 = 0x013B; //0000 0001 0011 1011 

/* 設置SPI的分頻 */
SPI1CON1bits.PPRE = 0b11;   //Secondary Prescale bits
SPI1CON1bits.SPRE = 0b110;  //Primary Prescale bits
/* Mode Select */
SPI1CON1bits.CKP = 0; //SPI1CON1<6>
SPI1CON1bits.CKE = 1; //SPI1CON1<8>
//Mode(0,0) : CKP=0; CKE=1
SPI1CON1bits.MODE16 = 0;
//Communication is word-wide 16 bits
  SPI1CON2 = 0x0000;
  SPI1STAT = 0x8000;        
}


腳位初始化 SPI腳位 Mapping

void InitPorts(void)
{
    TRISB = 0x0000;   //RB全部設成輸出

    /* 用 RB3 當 CS 位*/
    TRISBbits.TRISB3 = 0; //RB3(11)

    /* LDAC RB6 */
    TRISBbits.TRISB6 = 0; //RB6(17)

    /* 檢查ADC中斷用RB4腳位 */
    TRISBbits.TRISB4  = 0; //RB4 as output

    /* Mapping SPI output port*/
    RPOR0 = 0x0700;   //RP1(9):SDO1/RB1
    RPOR1 = 0x0008;   //RP2(10):SCK1/RB2
}