void Init_CLK(void)
{
unsigned int i;
FLL_CTL0 |= XCAP10PF; // Set load capacitance
FLL_CTL1 &= ~XT2OFF; // 打开 XT2
do
{ // 清除OSCFault标志
IFG1 &= ~OFIFG;
for(i = 0x20; i > 0; i--);
}
while((IFG1 & OFIFG) == OFIFG);//如果OSCFault =1
FLL_CTL1 = SELS; // Select SMCLK source as XT2CLK
FLL_CTL2 |= XT2S_2; //XT2频率范围选择为3~16MHz
FLL_CTL1 += SELM_XT2; //MCLK的时钟源为XT2CLK
return;
}
void delayus(uint x)
{
uint a;
for(a=0;a<x;a++);
// for(b=4;b>0;b--); //之前没有
}
void delayms(uint y)
{
uint a,b;
for(a=0;a<y;a++)
for(b=800;b>0;b--); //b=800 3200
}
//***************************************************************************//
// //
//函数:void Init_SSTSPI(void) //
//说明: 初始化SPI接口,P1.3:CE,P2.1:SIMO,P2.2:SOMI,P2.3:CLK //
// //
//***************************************************************************//
void Init_SSTSPI(void)
{
P2SEL = 0x0E; //setup P2 for SPI mode
P1DIR |= BIT3 + BIT7;
P1OUT |= BIT3 + BIT7; //STE = 1
//P2REN |= 0x01;
UCB1CTL0 = UCMSB + UCMST + UCSYNC; //Polarity,Master,8-bit, 3-Pin SPI
UCB1CTL1 = UCSSEL1 + UCSWRST; //SMCLK,UCSSEL1
UCB1BR0 = 0x04; //setup baud rate,2M
UCB1BR1 = 0x00;//
UCB1CTL1 &= ~UCSWRST; //SPI Enable
}
//***************************************************************************//
// //
//函数:void SSTSPI_SendByte(unsigned long, unsigned char) //
//说明: SPI发送一个数据 //
//参数: //
// //
//***************************************************************************//
void SSTSPI_SendByte(uchar byte)
{
while((UC1IFG & UCB1TXIFG)==0);
UCB1TXBUF = byte ;
delayus(1);
}
//***************************************************************************//
// //
//函数:void SSTSPI_SendByte(unsigned long, unsigned char) //
//说明: SPI发送一个数据 //
//参数: //
// //
//***************************************************************************//
uchar SSTSPI_ReciveByte(void)
{
uchar data=0;
while((UC1IFG & UCB1RXIFG)==0); //等待发送完成
data = UCB1RXBUF;
return data;
}
//***************************************************************************//
// //
//函数:void Read_JEDECID(char *) //
//说明: 读取SST25VF016B器件ID //
// //
//***************************************************************************//
uchar Read_JEDECID(void)
{
uchar data = 0;
P1OUT &= ~BIT3;
SSTSPI_SendByte(0x9F); // 读JEDEC ID
SSTSPI_SendByte(0xFF);
data = SSTSPI_ReciveByte();
//SSTSPI_SendByte(0xFF);
//*(data+1) = SSTSPI_ReciveByte();
//SSTSPI_SendByte(0xFF);
//*(data+2) = SSTSPI_ReciveByte();
//delayus(1);
P1OUT |= BIT3;
return data;
}
/********************Main********************/
void main(void)
{
uchar a=0;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
Init_CLK(); //初始化时钟
Init_SSTSPI(); //初始化SPI
delayms(100); //延时
a = Read_JEDECID();
}
以上是我的程序,查看了也没发现问题,SOMI线的时序是像下面这张图一样的,黄 {MOD}的是SOMI线,蓝 {MOD}的是SCLK线
此帖出自
小平头技术问答
一周热门 更多>