模拟SPI对LMH6401(PGA)写入数据后没有返回

2019-07-14 13:13发布

这是写入,发送,和读状态函数
/************向LMH6401 中写入一个字节*************************1*/         

void W_LMH6401_byte(unsigned char date)
{
        unsigned char temp;
        unsigned char i;
        temp = date;  

        for (i = 0; i < 8; i++) {
                SCK_0 ;
                if((temp&0x80)==0x80)
                        { MOSI_1; }
                else { MOSI_0; }
                SCK_1 ;
                temp <<= 1;
        }
          MOSI_0;               
}

/********************读取LMH6401 一个字节***********************2*/  

unsigned char R_LMH6401_byte(void)
{
        unsigned char temp=0;
        unsigned char i,SDI;

        for(i = 0; i < 8; i++) {
                temp <<= 1;
                SCK_0 ;        

                SDI = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
                if(SDI) {temp++;         }
//                else         {printf(" output low data ");}
                SCK_1 ;

        }
        return(temp);
}

/*******************读取LMH6401 状态**************************3*/  

unsigned char LMH6401_status(u8 addr)
{
         unsigned char status;
         DF_CS_0;  //片选打开
         delayus(10);

         W_LMH6401_byte(addr); //D7H是读取状态的命令字

         status = R_LMH6401_byte(); //读取状态字节

         DF_CS_1; //片选关闭
         delay(500);

         return status;

}


下面是读写的操作时序图

下面是寄存器

发送00,应该返回03,但是毫无反应无返回,发送其他指令也是

还有一个问题就是,如何发送7位地址,请各位帮忙解答一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
yjfkpyu
1楼-- · 2019-07-14 16:30
zhouxk 发表于 2019-4-18 12:10
你理解有误,地址和数据在同一串码中。
当片选有效后,发送的前8个位就是地址,接着往后的8个位是第一个数据,再8位是地址加1后的第二个数据,依此类推……,直到片选撤销。
写数据的同时,也在读数据,只是写走的是MOSI(SDI)、读走的是MISO(SDO)线。也就是说,给某个地址写入数是A,读时读出来的是B,相当于把数据更新 ...

四通道的,数据发送正确,可同时看CS,DIO,DO,CLK四路信号。三路正常,但是没返回。元件测试过没问题,默认增益2dB,尝试直接写数据,但是增益不变.发的是地址0x02,数据是0x14,查表知应该增益为14C:UsersyangzDesktopQQ截图20170617091144.png
yjfkpyu
2楼-- · 2019-07-14 18:22
zhouxk 发表于 2019-4-18 12:10
你理解有误,地址和数据在同一串码中。
当片选有效后,发送的前8个位就是地址,接着往后的8个位是第一个数据,再8位是地址加1后的第二个数据,依此类推……,直到片选撤销。
写数据的同时,也在读数据,只是写走的是MOSI(SDI)、读走的是MISO(SDO)线。也就是说,给某个地址写入数是A,读时读出来的是B,相当于把数据更新 ...

刚才回复的图

zhouxk
3楼-- · 2019-07-14 21:52
 精彩回答 2  元偷偷看……
yjfkpyu
4楼-- · 2019-07-15 03:23
真不好意思。我的代码贴的不对,我贴的是我最开始写的。后来用的是这个。你看到的波形就是这个程序

这个现在贴上正确的代码
#include "stm32f10x.h"
#include "bsp_usart.h"



#define        SPI_RFID_CS_PORT_A             GPIOA                    //CS
#define        SPI_RFID_CLK_PORT_A            GPIOB                     //CLK
#define        SPI_RFID_MISO_PORT_A           GPIOA                    //MISO
#define        SPI_RFID_MOSI_PORT_A           GPIOB                    //MOSI


#define        SPI_RFID_CS_A                  GPIO_Pin_4
#define        SPI_RFID_CLK_A                 GPIO_Pin_12
#define        SPI_RFID_MISO_A                GPIO_Pin_11
#define        SPI_RFID_MOSI_A                     GPIO_Pin_13




#define        Rfid_Cs_High_A()                    GPIO_SetBits(SPI_RFID_CS_PORT_A,SPI_RFID_CS_A)
#define        Rfid_Cs_Low_A()                       GPIO_ResetBits(SPI_RFID_CS_PORT_A,SPI_RFID_CS_A)

#define        Rfid_MOSI_High_A()                    GPIO_SetBits(SPI_RFID_MOSI_PORT_A,SPI_RFID_MOSI_A )
#define        Rfid_MOSI_Low_A()                   GPIO_ResetBits(SPI_RFID_MOSI_PORT_A,SPI_RFID_MOSI_A )

#define        Rfid_Clk_High_A()                    GPIO_SetBits(SPI_RFID_CLK_PORT_A,SPI_RFID_CLK_A )
#define        Rfid_Clk_Low_A()                    GPIO_ResetBits(SPI_RFID_CLK_PORT_A,SPI_RFID_CLK_A )

#define        Rfid_MISO_High_A()                    GPIO_SetBits(SPI_RFID_MISO_PORT_A,SPI_RFID_MISO_A )
#define        Rfid_MISO_Low_A()                    GPIO_ResetBits(SPI_RFID_MISO_PORT_A,SPI_RFID_MISO_A)

#define        Rfid_MISO_In_A()                   GPIO_ReadInputDataBit(SPI_RFID_MISO_PORT_A,SPI_RFID_MISO_A )


u8 ID = 0;

//void SPI_FLASH_Init1(void);
//u8 SPIx_FLASH_SendByte(u8 byte);

void InitRfid_A(void);

u8 RfidReadByte_A(u8 byte);

void RfidWriteByte_A(u8 addr,u8 data);

void Delay(__IO uint32_t nCount);


/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{
        u8 ID = 0;
//        u8 j = 0;
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
    USART_Config();
        InitRfid_A();
       
        Delay(720000);
        //RfidWriteByte_A(0x00);
//        for(j=0;j<100;j++)
//        {
                //ID = RfidReadByte_A(0x00);
               
       
        /* 发送一个字符串 */
                Usart_SendString( DEBUG_USARTx,"这是一个读LMH6401 ID实验 ");

                RfidWriteByte_A(0x02,0x0e);
                RfidWriteByte_A(0x02,0x0e);
                RfidWriteByte_A(0x02,0x0e);
                RfidWriteByte_A(0x02,0x0e);
       
//                printf("ID = %d ",ID);
//        }
       

  while(1)
        {       
               
        }       
}


void InitRfid_A(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable  and GPIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  /* Configure SPI Simulation pins: CS*/
  GPIO_InitStructure.GPIO_Pin = SPI_RFID_CS_A ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(SPI_RFID_CS_PORT_A, &GPIO_InitStructure);

  /* Configure SPI Simulation pins: CLK*/
  GPIO_InitStructure.GPIO_Pin = SPI_RFID_CLK_A;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(SPI_RFID_CLK_PORT_A, &GPIO_InitStructure);

  /* Configure SPI Simulation pins: MISO  */
  GPIO_InitStructure.GPIO_Pin = SPI_RFID_MISO_A;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(SPI_RFID_MISO_PORT_A, &GPIO_InitStructure);

  /* Configure SPI Simulation pins: MOSI  */
  GPIO_InitStructure.GPIO_Pin = SPI_RFID_MOSI_A;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(SPI_RFID_MOSI_PORT_A, &GPIO_InitStructure);


  /* Deselect the RC523: Chip Select high, Chip*/
  Rfid_Cs_High_A();
  Rfid_MOSI_Low_A();
  Rfid_Clk_Low_A();


}


u8 RfidReadByte_A(u8 byte)
{
        int i;
        u8 ch = 0 ;
            Rfid_Cs_Low_A();
        Rfid_Clk_Low_A();
        Delay(7200);

        for(i = 15; i >= 0; i--)
        {
                        if(i>7)
                        {
                                //MSB优先
                            if((byte >> i-8) & 0x01)
                        Rfid_MOSI_High_A();
                else
                        Rfid_MOSI_Low_A();

                //时钟高有效,上升沿保持稳定输入。
                Rfid_Clk_Low_A();
                Delay(7200);
                Rfid_Clk_High_A();
                Delay(7200);
                        }
            else
                        {
                            //时钟有效时,通知Slave预备数据
                Rfid_Clk_Low_A();
                Delay(7200);
                Rfid_Clk_High_A();
                Delay(7200);

                //MSB优先,上升沿采集数据。
                ch = (ch << 1)| Rfid_MISO_In_A();
                        }                               
                               
        }
        Rfid_Clk_Low_A();
        Rfid_Cs_High_A();
                Delay(7200);
        return ch ;   
}

void RfidWriteByte_A(u8 addr,u8 data)
{
        int i ;
               
                for(i = 15; i >= 0; i--)
        {
                        if(i>7)
                        {
                               
                                //MSB优先
                            if((addr >> i-8) & 0x01)
                        Rfid_MOSI_High_A();
                else
                        Rfid_MOSI_Low_A();

                //时钟高有效,上升沿保持稳定输入。
                Rfid_Clk_Low_A();
                Delay(7200);
                Rfid_Clk_High_A();
                Delay(7200);
                        }
            else
                        {
                                //MSB优先
                            if((data >> i) & 0x01)
                        Rfid_MOSI_High_A();
                else
                        Rfid_MOSI_Low_A();

                //时钟高有效,上升沿保持稳定输入。
                Rfid_Clk_Low_A();
                Delay(7200);
                Rfid_Clk_High_A();
                Delay(7200);
                        }                               
                               
        }
        Delay(7200);
        Rfid_Clk_Low_A();
        Rfid_MOSI_High_A();

}



void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}
rich_fush
5楼-- · 2019-07-15 06:14
你好,调好了吗?可以参考下程序吗?

一周热门 更多>