打印
[新手园地]

HOT大叔NUC120助学板第十贴----SPI(查询方式)

[复制链接]
7614|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Swallow_0322 于 2011-5-7 17:51 编辑

      菜鸟玩SPI查询方式完成对W25Q16BV的读写操作,望各位高手多多指教!

源代码如下:
/**************************************************
** 文件名称:NUC120_HOT_SPI.c
** 文件说明:NUC120助学板练习程序
** 创建日期:2011-05-07
** 修改日期:
** 备 注:SPI读写W25Q16BV
**************************************************/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvUART.h"
#include "Driver\DrvSPI.h"

#define Run_Led 2 //2----LED1 3----LED2 4----LED3 5----LED4
#define SPI_CS_PORT E_GPA
#define SPI_CS_PORT_NUM 14
#define Enable_SPI_CS DrvGPIO_ClrBit(SPI_CS_PORT,SPI_CS_PORT_NUM)
#define DISABLE_SPI_CS DrvGPIO_SetBit(SPI_CS_PORT,SPI_CS_PORT_NUM)

volatile uint8_t IsStart = FALSE;
volatile uint8_t Receive_Data = 0;



/***************
** 函数声明 **
***************/
void Init_System (void);
void Init_Uart (void);
void UART_INT_HANDLE(uint32_t u32IntStatus);

uint32_t SPI_ReadMidDid(void);
uint32_t SPI_ReadStatusReg1(void);
void SPI_WaitReady(void);
void SPI_ChipErase(void);
void SPI_ReadData(uint8_t *DataBuffer0, uint32_t StartAddress, uint32_t ByteCount);
void SPI_PageProgram(uint8_t *DataBuffer, uint32_t StartAddress, uint32_t ByteCount);
void SPI_SectorErase(uint32_t StartAddress);




/*****************************
** Name: UART_INT_HANDLE
** Function: UART Callback function
** Input: u32IntStatus
** OutPut: None
** Data: 2011-03-17
** Note:
****************************/
void UART_INT_HANDLE(uint32_t u32IntStatus)
{

uint8_t bInChar[1]={0xFF};

if(u32IntStatus & DRVUART_RDAINT)
{
/* Get all the input characters */
while(UART0->ISR.RDA_IF==1)
{
/* Get the character from UART Buffer */
DrvUART_Read(UART_PORT0,bInChar,1);
if (IsStart!=TRUE)
{
IsStart = TRUE;
Receive_Data = bInChar[0];
}
}
}
}

/*****************************
** Name: Init_System
** Function: 系统初始化函数
** Input: None
** OutPut: None
** Data: 2011-03-17
** Note:
****************************/
void Init_System(void)
{
/* Unlock the locked registers before access */
UNLOCKREG(x); //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
//这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
/* Enable the 12MHz oscillator oscillation */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //SYSCLK->WRCON.XTL12M_EN = 1;

/* Waiting for 12M Xtal stable */
//while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1); //SYSCLK->CLKSTATUS.XTL12M_STB
/*eClkSrc - [in] E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL */
// Note: Only some of NuMicro NUC100 Series support this function.

DrvSYS_Delay(5000);
LOCKREG(x);
//向“0x5000_0100”写入任何值,就可以重锁保护寄存器
}

/*****************************
** Name: Init_Uart
** Function: UART初始化函数
** Input: None
** OutPut: None
** Data: 2011-03-17
** Note:
****************************/
void Init_Uart(void)
{
STR_UART_T param;
/*
声明 UART设置的结构体 位于DRVUART.H
结构体如下
typedef struct DRVUART_STRUCT
{
uint32_t u32BaudRate;
E_DATABITS_SETTINS u8cDataBits;
E_STOPBITS_SETTINS u8cStopBits;
E_PARITY_SETTINS u8cParity;
E_FIFO_SETTINGS u8cRxTriggerLevel;
uint8_t u8TimeOut ;
}STR_UART_T;
*/
DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0); //使能UART时钟
//SYSCLK->CLKSEL1.UART_S = 0; //UART时钟源选择. 00 =外部12MHz 晶振 01 = PLL 1x =内部 22MHz 振荡器

DrvGPIO_InitFunction(E_FUNC_UART0); //GPB_MFP0-1-2-3置位 GPIO使能UART功能
//outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) | (0xF<<0));

param.u32BaudRate = 115200; // 波特率
param.u8cDataBits = DRVUART_DATABITS_8; // 数据位
param.u8cStopBits = DRVUART_STOPBITS_1; // 停止位
param.u8cParity = DRVUART_PARITY_NONE; // 校验位
param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; // FIFO存储深度 1 字节
param.u8TimeOut = 0; // FIFO超时设定
/* Set UART Configuration */
if(DrvUART_Open(UART_PORT0,¶m) != E_SUCCESS) // 串口开启、结构体整体赋值
printf("UART0 open failed\n");
/* u32Port -[in] UART Channel: UART_PORT0 / UART_PORT1 /UART_PORT2 */
/* sParam -[in] the struct parameter to configure UART */

/* Enable Interrupt and install the call back function */
DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT,UART_INT_HANDLE);
/*u32Port -[in] UART Channel: UART_PORT0 / UART_PORT1 / UART_PORT2 */
/*u32InterruptFlag -[in] DRVUART_LININT/DRVUART_WAKEUPINT/DRVUART_BUFERRINT/DRVUART_RLSINT */
/* DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT */
/*pfncallback -[in] A function pointer for callback function */
}

/*****************************
** Name: Init_SPI
** Function: SPI初始化函数
** Input: None
** OutPut: None
** Data: 2011-05-07
** Note:
****************************/
void Init_SPI(void)
{
DrvSPI_Open(eDRVSPI_PORT1, eDRVSPI_MASTER, eDRVSPI_TYPE1, 32,FALSE);
//配置SPI1为主模式 TYPE1波形 32位传输

DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST);
//配置传输比特的顺序:优先发送/接收MSB

DrvSPI_DisableAutoSS(eDRVSPI_PORT1);
//禁止自动片选功能

DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);
//设定从选择线的激活级别:低电平或者下降沿

DrvSPI_Set2BitTransferMode(eDRVSPI_PORT1, TRUE);
//设置2 比特串行数据I/O 模式

DrvSPI_SetClockFreq(eDRVSPI_PORT1, 1000000, 0);
//设置SPI的时钟频率为1MHz

DrvGPIO_Open(SPI_CS_PORT,SPI_CS_PORT_NUM, E_IO_OUTPUT); //SPI_FLAH_CS
DISABLE_SPI_CS;

}

int main (void)
{
uint8_t test = 250;
uint32_t Tmp = 0;
uint8_t DataBuffer[256];


Init_System();

Init_Uart();

Init_SPI();

DrvGPIO_Open(E_GPA,Run_Led, E_IO_OUTPUT); //程序运行指示
DrvGPIO_ClrBit(E_GPA,Run_Led);

printf("\n");
printf("/*==========================\n");
printf("======菜农 %d 助学计划======\n",test);
printf("========NUC120助学板========\n");
printf("======程序参考新唐例程======\n");
printf("=======2011年05月07日=======\n");
printf("======SPI实验(查询方式)=====\n");
SPI_WaitReady();
Tmp = SPI_ReadMidDid();
printf("W25Q16BV制造商ID及设备ID为:0x%X\n",Tmp);

//W25Q16BV Page 0 初始化
SPI_WaitReady();
SPI_ReadData(DataBuffer,0x1000,1);
if (DataBuffer[0]!=0xAA)
{
DataBuffer[0] = 0xAA;
SPI_WaitReady();
SPI_ChipErase();
SPI_WaitReady();
SPI_PageProgram(DataBuffer,0x1000,1);
for (Tmp=0;Tmp<256;Tmp++)
DataBuffer[Tmp] = Tmp;
SPI_WaitReady();
SPI_PageProgram(DataBuffer,0,256);
}

//W25Q16BV Page 0 读取
printf("Read Flash (Page 0) ...\n");
SPI_WaitReady();
SPI_ReadData(DataBuffer,0,256);
for (Tmp=0;Tmp<256;Tmp++)
{
printf("0x%X ",DataBuffer[Tmp]);
if ((Tmp%16)==15)printf("\n");
}
printf("Read Flash (Page 0) done!\n");

printf("'R/r'为读指令、'U/u'为Page 0加1并存储指令、'D/d'为Page 0减1并存储指令\n");
printf("====请输入字符开始测试!===\n");
printf("==========================*/\n");

while(1)
{
if (IsStart)
{
switch (Receive_Data)
{
case 'R':
case 'r':
printf("Read Flash (Page 0) ...\n");
SPI_WaitReady();
SPI_ReadData(DataBuffer,0,256);
for (Tmp=0;Tmp<256;Tmp++)
{
printf("0x%X ",DataBuffer[Tmp]);
if ((Tmp%16)==15)printf("\n");
}
printf("Read Flash (Page 0) done!\n");
break;
case 'U':
case 'u':
printf("rogram Flash (Page 0)[Add 1] ...\n");
SPI_WaitReady();
SPI_ReadData(DataBuffer,0,256);
for (Tmp=0;Tmp<256;Tmp++)
{
DataBuffer[Tmp] += 1;
}
SPI_WaitReady();
SPI_SectorErase(0x0000);
SPI_WaitReady();
SPI_PageProgram(DataBuffer,0,256);
printf("rogram Flash (Page 0)[Add 1] done!\n");
break;
case 'D':
case 'd':
printf("rogram Flash (Page 0)[Minus 1] ...\n");
SPI_WaitReady();
SPI_ReadData(DataBuffer,0,256);
for (Tmp=0;Tmp<256;Tmp++)
{
DataBuffer[Tmp] -= 1;
}
SPI_WaitReady();
SPI_SectorErase(0x0000);
SPI_WaitReady();
SPI_PageProgram(DataBuffer,0,256);
printf("rogram Flash (Page 0)[Minus 1] done!\n");
break;
default:
printf("请确认您输入的指令是否合法!\n");

}
IsStart = FALSE;
}
}
}

/*****************************
** Name: SPI_ReadMidDid
** Function: W25Q16BV读制造商ID及设备ID函数
** Input: None
** OutPut: MID & DID
** Data: 2011-05-07
** Note:
****************************/
uint32_t SPI_ReadMidDid(void)
{
uint32_t au32SourceData;
uint32_t au32DestinationData;

DrvSPI_SetBitLength(eDRVSPI_PORT1, 8);
//配置SPI传输的比特长度:8 bits

Enable_SPI_CS;
//激活/配置从设备片选信号

au32SourceData = 0x90;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0x90 (Read Manufacturer/Device ID)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DrvSPI_SetBitLength(eDRVSPI_PORT1, 24);
//配置SPI传输的比特长度:24 bits

au32SourceData = 0x0;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0x00 (24-bit Address)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DrvSPI_SetBitLength(eDRVSPI_PORT1, 16);
//配置SPI传输的比特长度:16 bits


au32SourceData = 0x0;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//接收数据

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DISABLE_SPI_CS;
//从设备片选信号取消激活

DrvSPI_DumpRxRegister(eDRVSPI_PORT1, &au32DestinationData, 1);
//从接收寄存器读数据. 但是不触发下一次数据传输.

return (au32DestinationData & 0xffff);
}

/*****************************
** Name: SPI_ReadStatusReg1
** Function: W25Q16BV读状态寄存器1函数
** Input: None
** OutPut: ReadStatusReg1
** Data: 2011-05-07
** Note:
****************************/
uint32_t SPI_ReadStatusReg1(void)
{
uint32_t au32SourceData;
uint32_t au32DestinationData;

DrvSPI_SetBitLength(eDRVSPI_PORT1, 16);
//配置SPI传输的比特长度:16 bits

Enable_SPI_CS;
//激活/配置从设备片选信号

au32SourceData = 0x0500;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0x0500 (Read status register 1)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DISABLE_SPI_CS;
//从设备片选信号取消激活

DrvSPI_DumpRxRegister(eDRVSPI_PORT1, &au32DestinationData, 1);
//从接收寄存器读数据. 但是不触发下一次数据传输.

return (au32DestinationData & 0xFF);
}

/*****************************
** Name: SPI_WaitReady
** Function: W25Q16BV忙状态检查函数
** Input: None
** OutPut: None
** Data: 2011-05-07
** Note:
****************************/
void SPI_WaitReady(void)
{
uint32_t ReturnValue;

do{
ReturnValue = SPI_ReadStatusReg1();
ReturnValue = ReturnValue & 1;
}while(ReturnValue!=0);
//检查从设备状态寄存器1的BUSY位 等待其为0
}

/*****************************
** Name: SPI_ChipErase
** Function: W25Q16BV片擦除函数
** Input: None
** OutPut: None
** Data: 2011-05-07
** Note:
****************************/
void SPI_ChipErase(void)
{

uint32_t au32SourceData;

DrvSPI_SetBitLength(eDRVSPI_PORT1, 8);
//配置SPI传输的比特长度:8 bits

Enable_SPI_CS;
//激活/配置从设备片选信号

au32SourceData = 0x06;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0x06 (Write enable)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DISABLE_SPI_CS;
//从设备片选信号取消激活

Enable_SPI_CS;
//激活/配置从设备片选信号

au32SourceData = 0xC7;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0xC7 (Chip Erase)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DISABLE_SPI_CS;
//从设备片选信号取消激活
}

/*****************************
** Name: SPI_ReadData
** Function: W25Q16BV读数据函数
** Input: DataBuffer0,StartAddressByteCount
** OutPut: None
** Data: 2011-05-07
** Note:
****************************/
void SPI_ReadData(uint8_t *DataBuffer, uint32_t StartAddress, uint32_t ByteCount)
{
uint32_t au32SourceData;
uint32_t au32DestinationData;
uint32_t Counter;

DrvSPI_SetBitLength(eDRVSPI_PORT1, 8);
//配置SPI传输的比特长度:8 bits

Enable_SPI_CS;
//激活/配置从设备片选信号

au32SourceData = 0x03;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0x03 (Read data)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DrvSPI_SetBitLength(eDRVSPI_PORT1, 24);
//配置SPI传输的比特长度:24 bits

au32SourceData = StartAddress;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: StartAddress

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DrvSPI_SetBitLength(eDRVSPI_PORT1, 8);
//配置SPI传输的比特长度:8 bits

for(Counter=0; Counter<ByteCount; Counter++)
{
au32SourceData = 0x0;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//接收数据;

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DrvSPI_DumpRxRegister(eDRVSPI_PORT1, &au32DestinationData, 1);
//从接收寄存器读数据. 但是不触发下一次数据传输.
DataBuffer[Counter] = (uint8_t) au32DestinationData;
}

DISABLE_SPI_CS;
//从设备片选信号取消激活
}

/*****************************
** Name: SPI_PageProgram
** Function: W25Q16BV按页编程函数
** Input: DataBuffer,StartAddressByteCount
** OutPut: None
** Data: 2011-05-07
** Note:
****************************/
void SPI_PageProgram(uint8_t *DataBuffer, uint32_t StartAddress, uint32_t ByteCount)
{
uint32_t au32SourceData;
uint32_t Counter;

DrvSPI_SetBitLength(eDRVSPI_PORT1, 8);
//配置SPI传输的比特长度:8 bits

Enable_SPI_CS;
//激活/配置从设备片选信号

au32SourceData = 0x06;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0x06 (Write enable)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DISABLE_SPI_CS;
//从设备片选信号取消激活

Enable_SPI_CS;
//激活/配置从设备片选信号

au32SourceData = 0x02;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0x02 (Page program)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DrvSPI_SetBitLength(eDRVSPI_PORT1, 24);
//配置SPI传输的比特长度:24 bits

au32SourceData = StartAddress;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: StartAddress

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DrvSPI_SetBitLength(eDRVSPI_PORT1, 8);
//配置SPI传输的比特长度:8 bits

for(Counter=0; Counter<ByteCount; Counter++)
{
au32SourceData = DataBuffer[Counter];
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲
}

DISABLE_SPI_CS;
//从设备片选信号取消激活
}

/*****************************
** Name: SPI_SectorErase
** Function: W25Q16BV扇区擦除函数
** Input: StartAddress
** OutPut: None
** Data: 2011-05-07
** Note:
****************************/
void SPI_SectorErase(uint32_t StartAddress)
{

uint32_t au32SourceData;

DrvSPI_SetBitLength(eDRVSPI_PORT1, 8);
//配置SPI传输的比特长度:8 bits

Enable_SPI_CS;
//激活/配置从设备片选信号

au32SourceData = 0x06;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0x06 (Write enable)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DISABLE_SPI_CS;
//从设备片选信号取消激活

DrvSPI_SetBitLength(eDRVSPI_PORT1, 8);
//配置SPI传输的比特长度:8 bits

Enable_SPI_CS;
//激活/配置从设备片选信号

au32SourceData = 0x20;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: 0x20 (Sector Erase)

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DrvSPI_SetBitLength(eDRVSPI_PORT1, 24);
//配置SPI传输的比特长度:24 bits

au32SourceData = StartAddress&0xFFF000;
DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);
//发送数据到 SPI 总线: StartAddress

while (DrvSPI_IsBusy(eDRVSPI_PORT1)) {}
//等待SPI端口空闲

DISABLE_SPI_CS;
//从设备片选信号取消激活
}


工程文件:
NUC120_HOT_SPI.rar (2.14 MB)

相关帖子

沙发
Swallow_0322|  楼主 | 2011-5-7 17:23 | 只看该作者
本帖最后由 Swallow_0322 于 2011-5-7 17:50 编辑

工程结构:


串口调试截图:
①上电截图:



② 发送'U'指令截图:

使用特权

评论回复
板凳
Swallow_0322|  楼主 | 2011-5-7 17:49 | 只看该作者
③ 发送'R'指令截图:


④ 发送'D'指令截图:


⑤ 发送'R'指令截图:

使用特权

评论回复
地板
john_lee| | 2011-5-7 18:19 | 只看该作者
支持,支持。

使用特权

评论回复
5
hotpower| | 2011-5-7 20:06 | 只看该作者
很好,再将其改为PDMA方式!

很给力!!!!!!!

使用特权

评论回复
6
Swallow_0322|  楼主 | 2011-5-8 07:38 | 只看该作者
4# john_lee

多谢老师捧场!
下一贴SPI(PDMA方式)之后准备搁置SD卡及I2S的音频驱动,熟悉老师的LooK+HOT大叔的红杏!

使用特权

评论回复
7
hotpower| | 2011-5-8 08:26 | 只看该作者
俺做菜鸟时做过spi+pdma,实际是usb转spi,与dsp通讯

使用特权

评论回复
8
weshiluwei6| | 2011-5-8 18:45 | 只看该作者
SPI 总线连的什么呢  大哥:loveliness:

使用特权

评论回复
9
Swallow_0322|  楼主 | 2011-5-8 19:48 | 只看该作者
9# weshiluwei6

呵呵!SPI查询方式完成对W25Q16BV的读写操作!

使用特权

评论回复
10
hotpower| | 2011-5-9 01:25 | 只看该作者
估计水王没玩过spi

使用特权

评论回复
11
ichuangj| | 2011-5-17 15:05 | 只看该作者
好!

使用特权

评论回复
12
weshiluwei6| | 2011-5-26 13:06 | 只看该作者
本帖最后由 weshiluwei6 于 2011-5-26 13:08 编辑

10# Swallow_0322

我找找看 没听说过这个 我以为事什么呢

使用特权

评论回复
13
weshiluwei6| | 2011-5-26 13:07 | 只看该作者
11# hotpower

哈哈 俺玩过74HC595 好像是SPI的么?

使用特权

评论回复
14
新好男孩| | 2011-8-10 17:29 | 只看该作者
      菜鸟玩SPI查询方式完成对W25Q16BV的读写操作,望各位高手多多指教!

源代码如下:/**************************************************
** 文件名称:NUC120_HOT_SPI.c
** 文件说明:NUC120助学板练习程序
* ...
Swallow_0322 发表于 2011-5-7 17:19


没有看到这句
DrvGPIO_InitFunction(E_FUNC_SPI1);
怎么在KEIL中就可以使用SPI功能呢?
我在IAR中,少了这句就不行。
?????

使用特权

评论回复
15
电子write_cai| | 2011-8-15 10:07 | 只看该作者
没有看到这句
DrvGPIO_InitFunction(E_FUNC_SPI1);
怎么在KEIL中就可以使用SPI功能呢?
我在IAR中,少了这句就不行。
?????
新好男孩 发表于 2011-8-10 17:29
这个GPIO端口使能SPI1功能.

使用特权

评论回复
16
Swallow_0322|  楼主 | 2011-8-15 10:53 | 只看该作者
To :电子write_cai
DrvSPI_Open(eDRVSPI_PORT1, eDRVSPI_MASTER, eDRVSPI_TYPE1, 32,FALSE);
//配置SPI1为主模式 TYPE1波形 32位传输

这个函数内有对SPI引脚功能的设置!

else if(eSpiPort == eDRVSPI_PORT1)
{
  SYSCLK->APBCLK.SPI1_EN     =1;
  SYS->IPRSTC2.SPI1_RST      =1;
  SYS->IPRSTC2.SPI1_RST      =0;
  SYS->GPCMFP.SPI1_SS0_MCLK  =1;
  SYS->GPCMFP.SPI1_CLK     =1;
  SYS->GPCMFP.SPI1_MISO0    =1;
  SYS->GPCMFP.SPI1_MOSI0     =1;
  SYS->GPBMFP.TM1_SS11       =1;
  SYS->ALTMFP.PB9_S11        =1;
}

使用特权

评论回复
17
hotpower| | 2011-8-15 10:56 | 只看该作者
学习某个外设模块的重点就是其初始化的设置过程及次序。

使用特权

评论回复
18
huzaizai007| | 2012-3-6 14:37 | 只看该作者
菜鸟求解
代码305行,读取设备ID函数SPI_ReadMidDid(void)中,在发送完24位的地址0x000000后,为什么还要发送16位的数据0x0000?
我注释掉后发送的设备ID不正确,W25Q16BV手册里没要求这步啊……

使用特权

评论回复
19
qdsubacnc| | 2012-3-6 14:57 | 只看该作者
帮楼主顶顶,有高手的帮忙解决一下啊

使用特权

评论回复
20
Swallow_0322|  楼主 | 2012-3-7 13:45 | 只看该作者
菜鸟求解
代码305行,读取设备ID函数SPI_ReadMidDid(void)中,在发送完24位的地址0x000000后,为什么还要发送16位的数据0x0000?
我注释掉后发送的设备ID不正确,W25Q16BV手册里没要求这步啊…… ...
huzaizai007 发表于 2012-3-6 14:37


发送16位的数据0x00是让SPI主设备发出16个脉冲,从而使主设备接收8位的Manufacturer ID和 Deveice ID!然后再通过库函数DrvSPI_DumpRxRegister读SPI总线接收数据。【个人理解,仅供参考】

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:播种一种行为,收获一种习惯;播种一种习惯,收获一种性格;播种一种性格,收获一种人生!

121

主题

1393

帖子

4

粉丝