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

模拟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个回答
七哥 回答时间: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
七哥 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版