⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_write_register.m

📁 MatLab图像传感器网络仿真平台WiSNAP
💻 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 + -