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

📄 io口模拟spi通信.txt

📁 用c语言写的一个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 + -