使用stm32f1的SPI1方式获取ATT7053BU的数据,该怎么获取

2019-07-21 04:57发布

如题,菜鸟在此求大神指导啊,不会写程序。
使用stm32f1的SPI1方式获取ATT7053BU的数据,该怎么获取。不知道怎么写程序,主要是电表芯片ATT7053BU的数据获取要怎么写呢。
要读取的数据所在的三组引脚:
V3P/V3N、V2P/V2N、V1P/V1N

附图为电路连接图,我摘出来了电表和stm32连接的部分,使用的SPI1.
有没有大神帮我指导指导啊,或者有程序也行,先谢谢了。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
lsy3500
2019-07-21 09:22
本帖最后由 lsy3500 于 2017-1-13 14:29 编辑
chenguozeng 发表于 2017-1-12 16:03
ATT7053BU是5V的,3.3V要选择ATT7053AU。 我有自己写了驱动代码,,有需求回复我就可以

我按照你给我发的代码修改了下,改到这里发现了一些地方看不懂,你能再麻烦你帮我再看看吗?非常感谢。
附图是读取数据时序图
因为想要读数据,所以我先修改了读取函数:
[mw_shl_code=c,true]//这是我定义的引脚宏
#define  ATT7053BU_CS             GPIO_Pin_4
#define  ATT7053BU_CS_PORT    GPIOA

#define  ATT7053BU_CLK            GPIO_Pin_5
#define  ATT7053BU_CLK_PORT   GPIOA

#define  ATT7053BU_DOUT              GPIO_Pin_6
#define  ATT7053BU_DOUT_PORT     GPIOA

#define  ATT7053BU_DIN            GPIO_Pin_7
#define  ATT7053BU_DIN_PORT   GPIOA[/mw_shl_code]
[mw_shl_code=c,true]u32 SPI_Read(uint8_t address){        int i;        
        u32 temp_data = 0;        
        
        //SPI_CLK = 0; CLK初始状态为0
        GPIO_ResetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);//GPIO_ResetBits(GPIOA, GPIO_Pin_5);
        Delay(1);        

        //SPI_CLK = 1; 电平拉高
        GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
        Delay(2);        
        
        //CS = 0; 片选置0,使生效
        GPIO_ResetBits(ATT7053BU_CS_PORT, ATT7053BU_CS);
        Delay(5);               
                                       
        //SPI_CLK = 1;        //高电平,启动数据传输
        GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
        Delay(1);
        
        //-------------------------------------------------------        //这里为什么要把DIN置0没看懂
        GPIO_ResetBits(ATT7053BU_DIN_PORT, ATT7053BU_DIN);
        Delay(1);
        
        //时钟引脚拉低,置0
        GPIO_ResetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
        Delay(1);
        

        //----->这段循环没看懂,不知道是不是我注释的这些意思
        //首先这段代码意思是:把数据放入读取数据寄存器?
        //8bit命令 == 1bit读写标志(最高位) + 7bit要访问的内存地址
        address = address | 0x7F;        //得到低7位(要存放数据的寄存器地址),并且:最高位为0,表示读数据。
        for(i=7; i>=0; i--)
        {
                //上升沿,进循环之前CLK是低电平,循环结尾也是低电平。---->给上升沿是因为在上升沿传输数据
                //SPI_CLK = 1;        //给高电平,启动数据传输
                GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
                Delay(1);
               
                //这段if也看不懂
                //一开始以为条件中是:获取了address的最高位(读写指示位),然后右移到最低位,可后来发现为什么是i呢?每次循环获取第i位是什么意思?
                if(((address & (0x01<<(i-1)))>>(i-1)))         //address 地址从0x00到0x7F
                {
                        GPIO_SetBits(SDI_PORT, SDI_PIN);    //1表示主机向从机写数据        
                }
                else
                {
                        GPIO_ResetBits(SDI_PORT, SDI_PIN);
                }

               
                //SPI_CLK = 0;        //置0,因为要在下次循环时有上升沿,上升沿传输数据
                GPIO_ResetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
                Delay(1);        
        }//从机接收到命令后,开始送出数据,上升沿送数据
        Delay(2);        
        
        //置高
        //SPI_CLK = 1;        
        GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
        Delay(1);
        
        //SPI_CLK = 0;下降沿读取数据
        GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
        temp_data = temp_data | ATT7053BU_DOUT; //读取最低位(第0bit)数据
        Delay(1);        
        
        //读取剩下的 第1bit到23bit 数据
        for(i=1; i<=23; i++)
        {
                //SPI_CLK = 1; 置高
                GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
                Delay(1);
               
                //SPI_CLK = 0; 下降沿读取数据
                GPIO_ResetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
                Delay(1);

                //读取数据
                temp_data = (temp_data<<1) | ATT7053BU_DOUT;
        }
        
        //SPI_CS = 1;片选信号拉高,结束SPI数据读取
        GPIO_SetBits(ATT7053BU_CLK_PORT, ATT7053BU_CLK);
        
        return temp_data;
}
[/mw_shl_code]

一周热门 更多>