|
发表于 2014-1-23 21:23:15
|
显示全部楼层
void pic_flash_init(void)
{
volatile CPU_INT16U regtmp;
/* Config ss1 pin --- rb2 */
TRISG &= ~((CPU_INT16U)0x1 << 9); /* PORTG.9 set output */
PORTG |= (CPU_INT16U)0x1 << 9; /* invalide chip selcet */
/************************************/
regtmp = 0; /* SCK1 and SDO1 as spi function pins ,8 bits */
regtmp &= ~((CPU_INT16U)0xf << 6); /* SPI mode 0 */
regtmp |= SPI_CON1_SPRE_1;
regtmp |= SPI_CON1_PRE_1; /* master clock = Fcy / 2 / 1 = 8M */
regtmp |= SPI_CON1_MASTER; /* SPI master mode */
SPI2CON1 = regtmp;
regtmp = 0;
regtmp &= ~((CPU_INT16U)0x1 << 6); /* Clear Receive Overflow Flag bit */
regtmp |= (CPU_INT16U)0x1 << 15; /* Enables module and configures SCKx, SDOx, SDIx and SSx as serial port pins */
SPI2STAT = regtmp;
}
static void _pic_flash_send_data(CPU_INT08U wdata)
{
volatile CPU_INT16U regtmp;
do
{
regtmp = SPI2STAT;
regtmp &= SPI_STAT_SPITBF;
}while(regtmp == SPI_STAT_SPITBF); /* buffer is full */
SPI2BUF = (CPU_INT08U)(wdata & 0xff);
do
{
regtmp = SPI2STAT;
regtmp &= SPI_STAT_SPIRBF;
}while(regtmp != SPI_STAT_SPIRBF); /* buffer is empty */
regtmp = SPI2BUF;
}
static CPU_INT08U _pic_flash_read_data(void)
{
volatile CPU_INT16U regtmp;
do
{
regtmp = SPI2STAT;
regtmp &= SPI_STAT_SPITBF;
}while(regtmp == SPI_STAT_SPITBF); /* buffer is full */
SPI2BUF = 0;
do
{
regtmp = SPI2STAT;
regtmp &= SPI_STAT_SPIRBF;
}while(regtmp != SPI_STAT_SPIRBF); /* buffer is empty */
regtmp = SPI2BUF;
return (CPU_INT08U)(regtmp & 0xff);
}
以上三个是我在protues上仿真,使用SPI控制器操作FLASH的基本接口。对于FLASH的读写操作使用上面两个读写操作按照FLASH手册组合即可。
|
|