|
系统倍频时钟是96m,spi时钟8分频。想操作25aa080。软件模拟没有问题,想用硬件spi。但是不能读。请高手指点。先谢谢:
#define SPI_CS (1 << 16) // P0.16口为片选脚
#define CE_Low() (LPC_GPIO0->FIOCLR |= SPI_CS) // 选中从器件
#define CE_High() (LPC_GPIO0->FIOSET |= SPI_CS)
/*******************************************************************************************
** 函数名称: SPIInit
** 功能说明: 初始化LPC2300系列ARM的SPI引脚及寄存器
** 入口参数: 无
** 出口参数: 无
*******************************************************************************************/
void SPIInit(void)
{
/* 初始化SPI引脚 */
LPC_PINCON->PINSEL0 = 0;
LPC_GPIO0->FIODIR |= SPI_CS; // 设置SPI的片选引脚
LPC_PINCON->PINSEL0 |= 0xc0000000; // 设置P0.15脚为SCK脚
LPC_PINCON->PINSEL1 = (0x03 << 2) | (0x03 << 4); // 设置P0.17、P0.18引脚为SPI引脚
/* 初始化SPI寄存器 */
LPC_SPI->SPCCR = 0x60; // 设置SPI时钟分频 pclk=96m spick=96/8=12m 12/12*8 = ok
LPC_SPI->SPCR = (0 << 2) | // SPI控制器每次传输发送和接收8位数据。
(0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样
(0 << 4) | // CPOL = 0, SCK 为高有效
(1 << 5) | // MSTR = 1, SPI 处于主模式
(1 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中断被禁止
}
/************************************************************************
** 函数名称: SPISndByte
** 函数功能: 通过硬件SPI接口发送一个字节
** 入口参数: data
** 出口参数: 无
************************************************************************/
void SPISndByte(unsigned char data)
{
unsigned long temp = 0;
//CE_Low();
LPC_SPI->SPDR = data;
while (0 == (LPC_SPI->SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕
temp = LPC_SPI->SPSR; // 通过读S0SPSR,清除SPIF标志
//CE_High();
temp = temp;
}
unsigned char SPIRdByte( void )
{
#if 1
return 0;
#else
unsigned long temp = 0;
unsigned char data;
//CE_Low();
while (0 == (LPC_SPI->SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕
data = LPC_SPI->SPDR;
temp = LPC_SPI->SPSR; // 通过读S0SPSR,清除SPIF标志
//CE_High();
temp = temp;
return data;
#endif
}
void SPIread(unsigned int eep_adr, unsigned char *dest, unsigned char lofdstr)
{
// lofdstr = length of the destination string
unsigned char k=0 ; // char counter
CE_Low();
SPISndByte(0x03) ; // insert READ instruction
k = eep_adr>>8 ;
SPISndByte(k) ; // write high byte of the address
k = eep_adr & 0xff ;
SPISndByte(k) ; // write low byte of the address
k=0;
sys_debug("test 1\r\n");
while( k < lofdstr )
{
*dest = SPIRdByte();
sys_debug("test 2\r\n");
dest++;
k++;
}
CE_High();
}
void SPI_test(void )
{
unsigned char magic[2]={0x55,0xaa};
char tmpbuf[100];
memset(magic, 0, 2);
SPIread(0, magic, 2);
sprintf(tmpbuf, "the magic is [0x%x-0x%x] \r\n", magic[0], magic[1]);
sys_debug(tmpbuf);
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|