Driver for MCP23S17 using SPI bus
CODE: MCP23S17.bas
Driver for AD9833 using SPI bus
CODE: ad9833.bas
'AD9833 module example code
D0=16:D1=5:D2=4:D3=0:D4=2:D5=14:D6=12:D7=13:D8=15:D9=3:D10=1
SCK=D5:MISO=D6:MOSI=D7:SS=D8
' AD9833 ref datasheet
'http://www.analog.com/media/en/technical-documentation/data-sheets/AD9833.pdf
' MCP41010 ref datasheet
' http://ww1.microchip.com/downloads/en/DeviceDoc/11195c.pdf
FSY = D8 ' pin for AD9833 chip select(FSY) pin on module
pin(FSY) = 1
Pin.Mode FSY, output
POT_CS = D0 ' pin for MCP41010 chip select (CS) pin on module
pin(POT_CS) = 1
Pin.Mode POT_CS, output
'set frequency couunter on PIN 5 (D1)
Counter.setup 1, D1, 1
'set SPI to mode 3
spi.setup 1000000, 3AD9833_resetAD9833_level 150freq = 1000wave = 2 ' sinelevel = 150 ' output levelAD9833_SetFreq freq, wave'define simple web pageclssp$ = string$(5, " ")a$ = ""a$ = a$ + "FREQUENCY " + textbox$(freq) + "<br><br>"a$ = a$ + "OUTPUT LEVEL "a$ = a$ + "<input type='number' data-var='level' onkeypress='cmdKeypress(event)'"a$ = a$ + "onchange='cmdChange(event)' min='0' max='255' value='150'><br><br>"a$ = a$ + button$("Sine", sine) + sp$ + button$("Triangle", triangle) + sp$a$ = a$ + button$("Square", square)a$ = a$ + "<br><br>"a$ = a$ + "Counter parameters<br>"a$ = a$ + "Counter <input type='text' data-var='counter.count(1)'><br>"a$ = a$ + "Frequency <input type='text' data-var='counter.freq(1)'><br>"a$ = a$ + "Period <input type='text' data-var='counter.period(1)'>"html a$onHtmlChange change_valuesautorefresh 1000waitsine:wave = 2AD9833_SetFreq freq, wavereturntriangle:wave = 1AD9833_SetFreq freq, wavereturnsquare:wave = 3AD9833_SetFreq freq, wavereturnchange_values:AD9833_SetFreq freq, waveAD9833_level levelreturn'--------- FUNCTIONS ----------------------' set the potentiometer level from 0 to 255sub AD9833_level(level) local a pin(POT_CS) = 0 a = SPI.Word(level or &h1100) pin(POT_CS) = 1end sub'reet the AD98333sub AD9833_reset local a Pin(FSY) = 0 a = SPI.WORD(&h2100) ' reset and B28 a = spi.word(&hc000) ' phase = 0 Pin(FSY) = 1end sub' sets the frequency (Hz) and waveform output' mode is 1 for triangle, 2 for sine, 3 for squareSub AD9833_SetFreq(Freq, mode) Local a, f, f1, f2, m oscillator = 25000000 'Crystal frequency f = (Freq * (1 << 28)) \ oscillator f1 = (f And &H3FFF) Or &H4000 f2 = (f >> 14) Or &H4000 Pin(FSY) = 0 select case mode case 1 m = &h02 ' triangle (bit MODE) case 2 m = 0 ' sine case else m = &h28 ' square ( bits OPBITEN and DIV2) end select a = SPI.WORD(&H2000 or m) ' B28 no reset + wave mode a = spi.word(f1) ' 14 bits MSB a = spi.word(f2) ' 14bits LSB Pin(FSY) = 1End Sub
' MCP23S17 Driver for Annex
' datasheet http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf
pin(15) = 1 'the GPIO15 is the CS
pin.mode 15, output
spi.setup 1000000
MCP23S17_ADDR = &h40 ' suppose A2, A1, A0 to GND
IODIRA = 0
IODIRB = 1
IPOLA = 2
IPOLB = 3
GPINTENA = 4
GPINTENB = 5
DEFVALA = 6
DEFVALB = 7
INTCONA = 8
INTCONB = 9
IOCONA = 10
IOCONB = 11
GPPUA = 12
GPPUB = 13
INTFA = 14
INTFB = 15
INTCAPA = 16
INTCAPB = 17
GPIOA = 18
GPIOB = 19
OLATA = 20
OLATB = 21
MCP23S17_WRITE IOCONA, &h08 ' init MCP23S17 with bit HAEN
MCP23S17_WRITE IODIRA, &h00 ' all PORT A pins as output
MCP23S17_WRITE IODIRB, &hff ' all PORT B pins as input
MCP23S17_WRITE GPPUB, &hff ' all PORT B pins as pullup
v = 0
for i = 0 to 255
for z = 0 to 255
MCP23S17_WRITE GPIOA, z ' pulse all GPIOA pins
MCP23S17_READ GPIOB, v ' read all GPIOB pins
print v
next z
next i
end
' function for read / write the MCP23S17
sub MCP23S17_WRITE(register, value)
local a
pin(15) = 0
a = SPI.byte(MCP23S17_ADDR)
a = SPI.byte(register)
a = SPI.byte(value)
pin(15) = 1
end sub
sub MCP23S17_READ(register, value)
local a
pin(15) = 0
a = SPI.byte(MCP23S17_ADDR or 1)
a = SPI.byte(register)
value = SPI.byte(0)
pin(15) = 1
end sub
-------------------------------------------