GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
// PA.3 ????????SPI??GIO2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
void SDIO_A6_Input(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void SDIO_A6_Out_1(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
}
void SDIO_A6_Out_0(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}
有四个核心函数:
发送1个字节
接收1个字节
读无线模块的寄存器
写无线模块的寄存器
问题现象: 1 发送出去的字节与原来的字节不一致;
2 写入无线模块寄存器中的值与读出来的值不一致。
这四个函数的代码如下:
(里面注释掉的是原来8位单片机用的,据说测试通过了的)
整个工程的代码详见附件。
请求大仙指点迷津。不甚感激至于,送我手上还没用的诺亚方舟船票一张,哈哈,留着以后备用啊!!!
/************************************************************************
** ByteSend 发送1个字节
************************************************************************/
void ByteSend(u8 src)
{
u8 i;
for(i = 0; i < 8; i++)
{
if(src & 0x80) // 0x80 = 1000 0000
//SDIO = 1; // #define SDIO P3_1 //spi SDIO
//SDIO = 1;//bit=1
SDIO_A6_Out_1();
else
//SDIO = 0;//bit=0
SDIO_A6_Out_0();
//_nop_();
Delay1ms(1);
//SCK = 1;
GPIO_SetBits(GPIOA,GPIO_Pin_5);
//_nop_();
Delay1ms(1);
//SCK = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
src = src << 1;
}
}
/************************************************************************
** ByteRead 读1个字节
************************************************************************/
u8 ByteRead(void)
{
u8 i,tmp;
//read data code
//SDIO = 1;//sdio pull high
// #define SDIO  

3_1 //spi SDIO
//SDIO = 1;//bit=1
GPIO_SetBits(GPIOA,GPIO_Pin_6);
for(i = 0; i < 8; i++)
{
//if(SDIO)
SDIO_A6_Input(); //更改为输入
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))
tmp = (tmp << 1) | 0x01;
else
tmp = tmp << 1;
//SCK = 1; // #define SCK P3_0 //spi SCK
//SCK = 1;
GPIO_SetBits(GPIOA,GPIO_Pin_5);
//_nop_(); // 指令功能:不执行任何操作,常用于产生一个机器周期的时间延迟。
Delay1ms(1);
//SCK = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
}
return tmp;
}
/************************************************************************
** A7108_WriteReg 写入寄存器
************************************************************************/
void A7108_WriteReg(u8 address, u16 dataWord)
{
u8 i;
//SCS = 0; //使能读写
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
address |= CMD_CTRLW; //#define CMD_CTRLW 0x00 //000x,xxxx control register write
// 写入地址 address:
for(i = 0; i < 8; i++)
{
if(address & 0x80)
//SDIO = 1;//bit=1
//GPIO_SetBits(GPIOA,GPIO_Pin_6);
SDIO_A6_Out_1();
else
//SDIO = 0;//bit=0
//GPIO_ResetBits(GPIOA,GPIO_Pin_6);
SDIO_A6_Out_0();
//SCK = 1;
GPIO_SetBits(GPIOA,GPIO_Pin_5);
//_nop_();
Delay1ms(1);
//SCK = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
address = address << 1;
}
//_nop_();
Delay1ms(1);
//send data word
for(i = 0; i < 16; i++)
{
if(dataWord & 0x8000)
//SDIO = 1;//bit=1
//GPIO_SetBits(GPIOA,GPIO_Pin_6);
SDIO_A6_Out_1();
else
//SDIO = 0;//bit=0
//GPIO_ResetBits(GPIOA,GPIO_Pin_6);
SDIO_A6_Out_0();
//SCK = 1;
GPIO_SetBits(GPIOA,GPIO_Pin_5);
//_nop_();
Delay1ms(1);
//SCK = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
dataWord = dataWord<< 1;
}
//SCS = 1; //失能读写
GPIO_SetBits(GPIOA,GPIO_Pin_4);
}
/************************************************************************
** A7108_ReadReg 读寄存器
************************************************************************/
u16 A7108_ReadReg(u8 address)
{
u8 i;
u16 tmp;
//SCS = 0; //使能读写
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
address |= CMD_CTRLR; // #define CMD_CTRLR 0x80 //100x,xxxx control register read
// 读取地址 address:
for(i = 0; i < 8; i++)
{
if(address & 0x80)
//SDIO = 1;//bit=1
//GPIO_SetBits(GPIOA,GPIO_Pin_6);
//SDIO_A6_Input();
SDIO_A6_Out_1();
else
//SDIO = 0;//bit=0
//GPIO_ResetBits(GPIOA,GPIO_Pin_6);
//SDIO_A6_Input();
SDIO_A6_Out_0();
//_nop_();
Delay1ms(1);
//SCK = 1;
GPIO_SetBits(GPIOA,GPIO_Pin_5);
//_nop_();
Delay1ms(1);
//SCK = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
address = address << 1;
}
//_nop_();
Delay1ms(1);
//SDIO = 1;//bit=1
GPIO_SetBits(GPIOA,GPIO_Pin_6);
//read data code
for(i = 0; i < 16; i++)
{
//if(SDIO)
SDIO_A6_Input(); // 更改为输入状态
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))
tmp = (tmp << 1) | 0x01;
else
tmp = tmp << 1;
//SCK = 1;
GPIO_SetBits(GPIOA,GPIO_Pin_5);
//_nop_();
Delay1ms(1);
//SCK = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
}
//SCS = 1; //失能读写
GPIO_SetBits(GPIOA,GPIO_Pin_4);
return tmp;
}