这是写入,发送,和读状态函数
/************向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位地址,请各位帮忙解答一下
这个现在贴上正确的代码
#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--);
}
一周热门 更多>