首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用GPIO模拟SPI总线进行通信

使用GPIO模拟SPI总线进行通信

下面给出了模拟SPI总线在模式1下进行读写的伪代码,用以说明如何使用GPIO实现SPI通信:

    ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    #define SS      252                     //定义SS所对应的GPIO接口编号  
    #define SCLK    253                     //定义SCLK所对应的GPIO接口编号  
    #define MOSI    254                     //定义SCLK所对应的GPIO接口编号  
    #define MISO    255                     //定义MISO所对应的GPIO接口编号  
    #define OUTP    1                       //表示GPIO接口方向为输出  
    #define INP 0                           //表示GPIO接口方向为输入  
    /* SPI端口初始化 */  
    void spi_init()  
    {  
    set_gpio_direction(SS, OUTP);  
    set_gpio_direction(SCLK, OUTP);  
    set_gpio_direction(MOSI, OUTP);  
    set_gpio_direction(MISO, INP);  
    set_gpio_value(SCLK, 0);                    //CPOL=0
    set_gpio_value(MOSI, 0);  
    }  
    /*  
    从设备使能  
    enable:为1时,使能信号有效,SS低电平  
    为0时,使能信号无效,SS高电平  
    */  
    void ss_enable(int enable)  
    {  
    if (enable)  
    set_gpio_value(SS, 0);                  //SS低电平,从设备使能有效  
    else  
    set_gpio_value(SS, 1);                  //SS高电平,从设备使能无效  
    }  
        /* SPI字节写 */  
    void spi_write_byte(unsigned char b)  
    {  
    int i;  
    for (i=7; i>=0; i--) {  
    set_gpio_value(SCLK, 0);  
    set_gpio_value(MOSI, b&(1<<i));         //从高位7到低位0进行串行写入  
    delay();                            //延时  
    set_gpio_value(SCLK, 1);                // CPHA=1,在时钟的第一个跳变沿采样  
    delay();      
    }  
    }  
    /* SPI字节读 */  
    unsigned char spi_read_byte()  
    {  
        int i;  
        unsigned char r = 0;  
        for (i=0; i<8; i++) {  
            set_gpio_value(SCLK, 0);  
            delay();                            //延时  
    set_gpio_value(SCLK, 1);                // CPHA=1,在时钟的第一个跳变沿采样  
    r = (r <<1) | get_gpio_value(MISO);         //从高位7到低位0进行串行读出  
    delay();  
        }  
    }  
    /*  
        SPI写操作  
        buf:写缓冲区  
        len:写入字节的长度  
    */  
    void spi_write (unsigned char* buf, int len)  
    {  
    int i;  
    spi_init();                         //初始化GPIO接口  
    ss_enable(1);                           //从设备使能有效,通信开始  
    delay();                                //延时  
    //写入数据  
    for (i=0; i<len; i++)  
    spi_write_byte(buf);  
    delay();  
    ss_enable(0);                           //从设备使能无效,通信结束  
    }  
    /*  
    SPI读操作  
    buf:读缓冲区  
    len:读入字节的长度  
    */  
    void spi_read(unsigned char* buf, int len)  
    {  
    int i;  
    spi_init();                         //初始化GPIO接口  
    ss_enable(1);                           //从设备使能有效,通信开始  
    delay();                                //延时  
    //读入数据  
    for (i=0; i<len; i++)  
    buf = spi_read_byte();  
    delay();  
    ss_enable(0);                           //从设备使能无效,通信结束  
    }

继承事业,薪火相传
返回列表