📄 spi_write_register.m
字号:
function status = spi_write_register(port,address,value);
%Serial Peripheral Interface (4-wire SPI) register write.
% STATUS = SPI_WRITE_REGISTER(PORT,ADDRESS,VALUE);
%
% Input Parameters:
% ================
%
% port --------------> Parallel port base address decimal (positive integer).
% address -----------> Register address decimal (positive integer).
% value -------------> Register value decimal (positive integer).
%
% Output Parameters:
% =================
%
% status ------------> Success status (-1 = error, +1 = success).
%
% See also SPI_READ_REGISTER.
% Stephan Hengstler
% Stanford Wireless Sensor Networks Lab
% January 07, 2005
%
% Last modified: 01-21-2005
% .MEX C Source: spi_write_register.c
%*********************** Serial Peripheral Interface Write Register ***********************
% ** Parallel-to-SPI Adapter Configuration **
% -------------------------------------------
% ADNS-3060 Parallel Port Sub-D 25
% Pin Name Pin SPP Name Dir
% -------------------------------------------
% 1 NCS --- 14 NAUTO-LINEFEED OUT
% 2 MISO --- 11 BUSY IN
% 3 SCLK --- 1 NSTROBE OUT
% 4 MOSI --- 2 DATA 0 OUT
% 6 RESET --- 16 NSELECT OUT
% 7 NPD --- 17 INITIALIZE OUT
% 19 GND --- 18 GROUND N/A
% -------------------------------------------
% define port addresses
DATA_PORT = port;
STAT_PORT = DATA_PORT + 1;
CTRL_PORT = DATA_PORT + 2;
% define signal bit masks
MASK_NCS = 2;
MASK_NPD = 3;
MASK_MOSI = 1;
MASK_MISO = 8;
MASK_RESET = 4;
MASK_SCLK = 1;
% set direction out
ctrl_value = inp32(CTRL_PORT);
ctrl_value = bitset(ctrl_value,6,0);
% raise chip select
ctrl_value = bitset(ctrl_value,MASK_NCS,1);
out32(CTRL_PORT,ctrl_value)
% get data value
data_value = inp32(DATA_PORT);
% address cycle
address = bitset(address,8,1);
for bit = 8:-1:1
% clear sclk
ctrl_value = bitset(ctrl_value,MASK_SCLK,1);
out32(CTRL_PORT,ctrl_value)
% place bit on mosi
data_value = bitset(data_value,MASK_MOSI,bitget(address,bit));
out32(DATA_PORT,data_value)
% raise sclk
ctrl_value = bitset(ctrl_value,MASK_SCLK,0);
out32(CTRL_PORT,ctrl_value)
end
% data cycle
for bit = 8:-1:1
% clear sclk
ctrl_value = bitset(ctrl_value,MASK_SCLK,1);
out32(CTRL_PORT,ctrl_value)
% place bit on mosi
data_value = bitset(data_value,MASK_MOSI,bitget(value,bit));
out32(DATA_PORT,data_value)
% raise sclk
ctrl_value = bitset(ctrl_value,MASK_SCLK,0);
out32(CTRL_PORT,ctrl_value)
end
% clear chip select
ctrl_value = bitset(ctrl_value,MASK_NCS,0);
out32(CTRL_PORT,ctrl_value)
% return status
status = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -