📄 spi_read_register.m
字号:
function value = spi_read_register(port,address);
%Serial Peripheral Interface (4-wire SPI) register read.
% VALUE = SPI_READ_REGISTER(PORT,ADDRESS);
%
% Input Parameters:
% ================
%
% port --------------> Parallel port base address decimal (positive integer).
% address -----------> Register address decimal (positive integer).
%
% Output Parameters:
% =================
%
% value -------------> Register value decimal (positive integer).
%
% See also SPI_WRITE_REGISTER.
% Stephan Hengstler
% Stanford Wireless Sensor Networks Lab
% January 06, 2005
%
% Last modified: 01-21-2005
% .MEX C Source: spi_read_register.c
%*********************** Serial Peripheral Interface Read 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
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
% insert delay per data sheet
% pause(75e-6)
% data cycle
value = 0;
for bit = 8:-1:1
% clear sclk
ctrl_value = bitset(ctrl_value,MASK_SCLK,1);
out32(CTRL_PORT,ctrl_value)
% sense bit from miso
dummy = not(bitget(inp32(STAT_PORT),MASK_MISO));
value = bitset(value,bit,dummy);
% 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -