你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
木一22 提问时间:2017-6-16 10:02 /
这是写入,发送,和读状态函数
/************向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;

}


下面是读写的操作时序图
QQ截图20170616095550.png QQ截图20170616095622.png
下面是寄存器
QQ截图20170616095637.png
发送00,应该返回03,但是毫无反应无返回,发送其他指令也是

还有一个问题就是,如何发送7位地址,请各位帮忙解答一下






收藏 评论6 发布时间:2017-6-16 10:02

举报

6个回答
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个位是第一个数 ...

刚才回复的图
QQ截图20170617091144.png
QQ截图20170617091725.png
QQ截图20170617092356.png
toofree 回答时间:2017-6-17 14:50:44
本帖最后由 toofree 于 2017-6-17 14:52 编辑

不知道你想做什么?是真的想解决问题吗?

程序太零散,并且程序和时序不一致。
示波器显示一个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;

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


x木木。 回答时间:2017-8-6 17:22:19
你好,调好了吗?可以参考下程序吗?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版