OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6079|回复: 3

SPI通信,读写函数的编写(硬件接口,软件模拟)

[复制链接]

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2018-4-2 14:19:12 | 显示全部楼层 |阅读模式
7金钱

F103和ML5238通信

F103和ML5238通信


这里我用的F103的SPI2 与 ML5238进行通信,首先我需要发送指令去初始化ML5238芯片的寄存器,然后才能使用ML5238芯片的功能。

但是我查看原子的例程,里面的读写函数似乎不能好好的利用,所以在此求助各位。

SDI读写.png
这是ML5238  里SPI的时序图,SDI前面写寄存器的地址,RW控制 读写,后面操作读写的数据。
使用软件模拟的话,这种操作怎么写出来?
电源寄存器地址.png VMON.png

VMON 这个寄存器的地址是0x01,但是操作这个寄存器的话,是发送 0x011F 这种数据过去吗?

真的是新手上路,全身疑惑,希望各位老哥谈谈看法。

void Write_AD5592(unsigned char who,unsigned short data)
{         
    unsigned char i;      

        Set_SPI_SCLK_L();
        delay(20);
    if(who == 0)
    {
        Set_AD5592_1_Enable();
        }
    else
    {
        Set_AD5592_2_Enable();
    }
    delay(20);
    for(i = 0; i < 16; i++)
    {            
        Set_SPI_SCLK_H();
                delay(20);

        if(data & 0x8000)
        {
            Set_SPI_MOSI_H();
        }
        else
        {
            Set_SPI_MOSI_L();
        }
        data <<= 1;
        delay(20);
        Set_SPI_SCLK_L();          //下降延写入
                delay(20);
    }
        Set_SPI_SCLK_H();
    if(who == 0)
    {
        Set_AD5592_1_Disable();
        }
    else
    {
        Set_AD5592_2_Disable();
    }   
        delay(50);   
}
//0011 1000 0101 0011 0x3853
unsigned short Read_AD5592(unsigned char who)
{         
    unsigned char i;
        unsigned short data;
       
        data = 0;
             
    Set_SPI_SCLK_L();
        delay(20);
    if(who == 0)
    {
        Set_AD5592_1_Enable();
        }
    else
    {
        Set_AD5592_2_Enable();
    }
        delay(20);
    for(i = 0; i < 16; i++)
    {            
        data <<= 1;
                Set_SPI_SCLK_H();
                delay(20);
                if(Get_SPI_MISO())
                {
                        data += 1;
                }      
        Set_SPI_SCLK_L();
                delay(20);       
    }
        Set_SPI_SCLK_H();
    if(who == 0)
    {
        Set_AD5592_1_Disable();
        }
    else
    {
        Set_AD5592_2_Disable();
    }
        delay(50);

        return data;   
}


这里附上我在网上找的一段软件模拟的读写代码,我感觉我这寄存器是8位的,但是写数据又不知道怎么办。

最佳答案

查看完整内容[请看2#楼]

从时序图看,SCK空闲为低电平,数据在SCK上升沿传输,那么你要在SCK高电平(上升沿之后)取数据, 芯片的寄存器地址是7位的,占用SPI传输第1个字节的高7位,最低位是读写位,那么你的第一个字节就是(RegAddr
茵茵猪头
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-3-14
在线时间
19 小时
发表于 2018-4-2 14:19:13 | 显示全部楼层
从时序图看,SCK空闲为低电平,数据在SCK上升沿传输,那么你要在SCK高电平(上升沿之后)取数据,
芯片的寄存器地址是7位的,占用SPI传输第1个字节的高7位,最低位是读写位,那么你的第一个字节就是(RegAddr << 1) | (RWbit)
要直接参考Write_AD5592的话,人家是写16位,你的就可以改改,把(RegAddr << 1) | (RWbit)和DataByte合并成1个16位数据
其他的就是看看时序了。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-4-3 08:42:57 | 显示全部楼层
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2018-4-4 09:18:14 | 显示全部楼层
qinlicn 发表于 2018-4-2 19:31
从时序图看,SCK空闲为低电平,数据在SCK上升沿传输,那么你要在SCK高电平(上升沿之后)取数据,
芯片的 ...

老哥,如果合并的话,是不是 (RegAddr << 9) | (RWbit << 8) | (Data),应该是这样吧。
C:\Users\ht\Desktop\stm32f407zg6\电源保护板\get_spi_miso.png

老哥,还有一个问题,就是 读函数那里,if(Get_SPI_MISO()),这个里面的函数应该是得到某些状态的吧?请问里面是怎么实现的
茵茵猪头
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 20:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表