木一22 发表于 2017-6-16 10:02:57

模拟SPI 对LMH6401(PGA)写入数据,无返回

这是写入,发送,和读状态函数
/************向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("\n\r output low data \n\r");}
                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位地址,请各位帮忙解答一下






toofree 发表于 2017-6-16 11:02:14

你理解有误,地址和数据在同一串码中。
当片选有效后,发送的前8个位就是地址,接着往后的8个位是第一个数据,再8位是地址加1后的第二个数据,依此类推……,直到片选撤销。
写数据的同时,也在读数据,只是写走的是MOSI(SDI)、读走的是MISO(SDO)线。也就是说,给某个地址写入数是A,读时读出来的是B,相当于把数据更新了。如果想恢复数据,再次写入B,即可。

木一22 发表于 2017-6-17 09:28:41

toofree 发表于 2017-6-16 11:02
你理解有误,地址和数据在同一串码中。
当片选有效后,发送的前8个位就是地址,接着往后的8个位是第一个数 ...

四通道的,数据发送正确,可同时看CS,DIO,DO,CLK四路信号。三路正常,但是没返回。元件测试过没问题,默认增益2dB,尝试直接写数据,但是增益不变.发的是地址0x02,数据是0x14,查表知应该增益为14C:\Users\yangz\Desktop\QQ截图20170617091144.png

木一22 发表于 2017-6-17 09:30:23

toofree 发表于 2017-6-16 11:02
你理解有误,地址和数据在同一串码中。
当片选有效后,发送的前8个位就是地址,接着往后的8个位是第一个数 ...

https://www.stmcu.org.cn/module/forum/forum.php?mod=image&aid=395987&size=300x300&key=a842aa408d5e91b6&nocache=yes&type=fixnonehttps://www.stmcu.org.cn/module/forum/forum.php?mod=image&aid=395988&size=300x300&key=d8558a5eb331fbee&nocache=yes&type=fixnonehttps://www.stmcu.org.cn/module/forum/forum.php?mod=image&aid=395989&size=300x300&key=32eb36abfb95b861&nocache=yes&type=fixnone刚才回复的图

toofree 发表于 2017-6-17 14:50:44

本帖最后由 toofree 于 2017-6-17 14:52 编辑

木一22 发表于 2017-6-17 09:30
刚才回复的图
不知道你想做什么?是真的想解决问题吗?

程序太零散,并且程序和时序不一致。
示波器显示一个SPI时钟是2ms多一点,程序里并没有任何延时,不可能跑这么慢。
接收程序里没看到你发送数据的移位,但示波器波形显示,你接收时,肯定发送数据了。
波形中没有看到你的CS信号变化,但是程序中有DF_CS_0,DF_CS_1,姑且认为你有波形并且正确吧。片选到来后的连续8位为地址。
从你波形看,你的确是发的地址0x02,数据0x14,查表增益为6db。

接收信号线数据一直为0,有可能是IO方向没设对。正常情况下,不可能一直是零,没有片选的情况下,要么是高阻态,要么是弱上拉电平,很少会一直是低电平情况。SPI初始化函数没有给出来,不知道你都做了什么?

木一22 发表于 2017-6-18 01:56:21

toofree 发表于 2017-6-17 14:50
不知道你想做什么?是真的想解决问题吗?

程序太零散,并且程序和时序不一致。


真不好意思。我的代码贴的不对,我贴的是我最开始写的。后来用的是这个。你看到的波形就是这个程序

这个现在贴上正确的代码
#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实验\n");

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

while(1)
        {       
               
        }       
}


void InitRfid_A(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Enableand 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--);
}


x木木。 发表于 2017-8-6 17:22:19

你好,调好了吗?可以参考下程序吗?:loveliness:
页: [1]
查看完整版本: 模拟SPI 对LMH6401(PGA)写入数据,无返回