贴出部源码
void SPIInit(void)
{
/* 初始化SPI引脚 */
LPC_PINCON->INSEL0 |= (0x03ul << 30); /* 设置P0.15脚为SCK脚 */
LPC_PINCON->INSEL1 &= ~(0x03 << 0);
LPC_GPIO0->FIODIR |= SPI_CS; /* 设置SPI的片选引脚 */
CE_High();
LPC_PINCON->INSEL1 |= (0x03 << 2) | (0x03 << 4); /* 设置P0.17、P0.18 */
/* 引脚为SPI引脚 */
/* 初始化SPI寄存器 */
//这里说明一下,SPI时钟为24M,然后0X40分频(64分频),这里对吗?
LPC_SPI->SPCCR = 0x40; /* 设置SPI时钟分频 */
LPC_SPI->SPCR = (0 << 2) | /* SPI控制器每次传输 */
/* 发送和接收8位数据 */
(1 << 3) | /* CPHA = 0, 数据在SCK */
/* 的第一个时钟沿采样 */
(1 << 4) | /* CPOL = 0, SCK 为高有效 */
(1 << 5) | /* MSTR = 1, SPI 处于主模式 */
(0 << 6) | /* LSBF = 0, SPI 数据 */
/* 传输MSB (位7)在先 */
(0 << 7); /* SPIE = 0, SPI 中断被禁止 */
}
//--------------------------------
void SPIx_SetSpeed(uint8_t SpeedSet)
{
//0x100=256,0x80=128,0x40=64;
LPC_SPI->SPCCR = SpeedSet;
}
//这里设两种速度,8分频为高速,64分频为低速。
unsigned char SPIx_ReadWriteByte(unsigned char TxData)
{
uint32_t temp = 0;
LPC_SPI->SPDR = TxData;
while (0 == ( LPC_SPI->SPSR & 0x80)); /* 等待SPIF置位, */
/* 即等待数据发送完毕 */
temp = (uint32_t) LPC_SPI->SPSR; /* 清除SPIF标志 */
temp = temp ;
return (INT8U)(LPC_SPI->SPDR);
}
//--------------------------------------------
//这里去读寄存器的时候,例如temp=SPIx_ReadWriteByte(0xff);TEMP会是0,量过信号线,信号线动作正常。求解????是不是频率设得有问题?
uint16_t VS_RD_Reg(uint8_t address)
{
uint16_t temp=0;
while(GPIO_ReadInputDataBit(LPC_GPIO0,DREQ_pin0)==0);//非等待空闲状态
SPIx_SetSpeed(SPI_SPEED_64);//低速
TXDCS_SET(1);//VS_XDCS=1; //MP3_DATA_CS=1;
TCS_SET(0);//VS_XCS=0; //MP3_CMD_CS=0;
SPIx_ReadWriteByte(VS_READ_COMMAND);//发送VS10XX的读命令
SPIx_ReadWriteByte(address); //地址
temp=SPIx_ReadWriteByte(0xff); //读取高字节
temp=temp<<8;
temp+=SPIx_ReadWriteByte(0xff); //读取低字节
TCS_SET(1);//VS_XCS=1; //MP3_CMD_CS=1;
SPIx_SetSpeed(SPI_SPEED_8);//高速
return temp;
}
至于VO53部分全是抄版本的,应该不会是问题。
|