这是写入,发送,和读状态函数 /************向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位地址,请各位帮忙解答一下 |
当片选有效后,发送的前8个位就是地址,接着往后的8个位是第一个数据,再8位是地址加1后的第二个数据,依此类推……,直到片选撤销。
写数据的同时,也在读数据,只是写走的是MOSI(SDI)、读走的是MISO(SDO)线。也就是说,给某个地址写入数是A,读时读出来的是B,相当于把数据更新了。如果想恢复数据,再次写入B,即可。
四通道的,数据发送正确,可同时看CS,DIO,DO,CLK四路信号。三路正常,但是没返回。元件测试过没问题,默认增益2dB,尝试直接写数据,但是增益不变.发的是地址0x02,数据是0x14,查表知应该增益为14C:\Users\yangz\Desktop\QQ截图20170617091144.png
刚才回复的图
不知道你想做什么?是真的想解决问题吗?
程序太零散,并且程序和时序不一致。
示波器显示一个SPI时钟是2ms多一点,程序里并没有任何延时,不可能跑这么慢。
接收程序里没看到你发送数据的移位,但示波器波形显示,你接收时,肯定发送数据了。
波形中没有看到你的CS信号变化,但是程序中有DF_CS_0,DF_CS_1,姑且认为你有波形并且正确吧。片选到来后的连续8位为地址。
从你波形看,你的确是发的地址0x02,数据0x14,查表增益为6db。
接收信号线数据一直为0,有可能是IO方向没设对。正常情况下,不可能一直是零,没有片选的情况下,要么是高阻态,要么是弱上拉电平,很少会一直是低电平情况。SPI初始化函数没有给出来,不知道你都做了什么?
真不好意思。我的代码贴的不对,我贴的是我最开始写的。后来用的是这个。你看到的波形就是这个程序
这个现在贴上正确的代码
#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--);
}