📄 io口模拟spi通信.txt
字号:
一个用IO口模拟SPI总线访问的C程序例子,可以移植到任何单片机系统中。
/************* 定义SPI的引脚端口 **************/
/*********** 根据不同的MCU添加相应的代码完善 ************/
#define SET_SCS /* SPI片选引脚置高 */
#define RESET_SCS /* SPI片选引脚置低 */
#define SET_SCLK /* SPI时钟引脚置高 */
#define RESET_SCLK /* SPI时钟引脚置低 */
#define SET_MOSI /* SPI主输出/从输入引脚置高 */
#define RESET_MOSI /* SPI主输出/从输入引脚置低 */
#define MISO /* SPI主输入/从输出 */
/********************************************************************
IO_Config主要是对IO口进行初始化设置
根据不同的MCU添加相应的代码,实现下面注释部分的功能
********************************************************************/
void IO_Config ( void )
{
/* 定义SCS口为输出,根据不同的MCU添加代码,*/
/* 初始化为高电平 */
SET_SCS
/* 定义SCLK口为输出,根据不同的MCU添加代码,*/
/* 初始化为低电平 */
RESET_SCS
/* 定义MOSI口为输出,根据不同的MCU添加代码,*/
/* 定义MISO口为输入,根据不同的MCU添加代码,*/
}
/********************************************************************
通过SPI总线输出一个字节
********************************************************************/
void SPI_Out ( unsigned char dat )
{
unsigned char i;
for ( i = 0; i < 8; i++)
{
if ( dat & 0x80 )
SET_MOSI
else
RESET_MOSI
SET_SCLK /* 时钟上升 */
dat <<= 1;
RESET_SCLK /* 时钟下降 */
}
}
/********************************************************************
通过SPI向W5100写入数据
输入参数:写入地址addr,写入的数据dat
无返回参数
********************************************************************/
void Write_W5100_SPI ( unsigned int addr, unsigned char dat )
{
RESET_SCS /* SPI的片选置低 */
/* 输出的第一个字节为写命令 */
SPI_Out ( 0xf0 ); /* 写命令*/
/* 输出的第二个字节为地址高8位 */
SPI_Out ( addr / 256 ); /* 地址高8位 */
/* 输出的第三个字节为地址低8位 */
SPI_Out ( addr ); /* 地址低8位 */
/* 输出的第四个字节为写入的数据 */
SPI_Out ( dat );
SET_SCS /* SPI的片选置高 */
}
/********************************************************************
通过SPI读取W5100的数据
输入参数:读取地址addr,
返回参数:读取的数据
********************************************************************/
unsigned char Read_W5100_SPI ( unsigned int addr )
{
unsigned char i, j;
RESET_SCS /* SPI的片选置低 */
/* 输出的第一个字节为写命令 */
SPI_Out ( 0x0f ); /* 读命令*/
/* 输出的第二个字节为地址高8位 */
SPI_Out ( addr / 256 ); /* 地址高8位 */
/* 输出的第三个字节为地址低8位 */
SPI_Out ( addr ); /* 地址低8位 */
/* 输出一个空字节,读取一个字节的数据 */
j=0;
for( i = 0; i < 8; i++ )
{
SET_SCLK /* 时钟上升 */
j <<= 1;
if( MISO )
j |= 0x01;
RESET_SCLK /* 时钟下降 */
}
SET_SCS /* SPI的片选置高电平 */
return j;
}
先调用IO_Config()函数对IO口进行初始化设置。然后再使用Write_W5100_SPI和Read_W5100_SPI对W5100进行访问。
用户可以参考浩然电子提供的W5100的标准访问函数。这些函数都是MCU在直接总线方式下对W5100的访问。要将这些函数移植到SPI总线方式访问,只需要作下面的修改。
向W5100写数据,直接总线的操作方法:
ptr = (unsigned char *) addr;
*ptr = dat;
SPI总线的操作方法:
Write_W5100_SPI( addr, dat );
读取W5100的数据,直接总线的操作方法:
ptr = (unsigned char *) addr;
dat = *ptr;
SPI总线的操作方法:
dat = Read_W5100_SPI( addr );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -