问一个关于STM32 SPI的问题
打算用STM32读写93C46,因为是SPI总线所以,用STM32的SPI2读写,可怎么都不行,后来又GPIO模拟也不行,请教一下高手,是什么问题呢?
模拟SPI程序如下:
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler);
#if(bb)
void c46init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void Ewen(void)
{
u8 temp,InData;
CS=0;
delay_us(1);
CLK=0;
CS=1;
InData=0x98; // 10011XXXX
for(temp=9;temp!=0;temp--)
{ // 9位的指令(当93c46选择为16结构时,93c46有7条9位的指令
DI=InData&0x80; // 将InData按位输入
CLK=1;delay_us(1); CLK=0;
InData<<=1; //InData=InData<<1;
}
CS=0;
}
void Ewds(void)
{
u8 temp,InData;
CS=0;
delay_us(1);
CLK=0;
CS=1;
InData=0x80; // 10000XXXX
for(temp=9;temp!=0;temp--)
{ // 9位的指令(当93c46选择为16结构时,93c46有7条9位的指令
DI=InData&0x80; // 将InData按位输入
CLK=1; delay_us(1);CLK=0;
InData<<=1; //InData=InData<<1;
}
CS=0;
}
//写入93c46RAM
void write(unsigned char address,unsigned int InData)
{
u8 temp;
Ewen();
CLK=0; DI=1; // 101 A5-A0
CS=0;delay_us(1); CS=1;
CLK=1;delay_us(1); CLK=0; // 先输入一个1
address=address&0x3f|0x40; // address变成10xxxxxx
for(temp=8;temp!=0;temp--) // 接下来连续输入8位(在93C46中的地址 指令形式 101 A5-A0)
{ // 8
DI=address&0x80;
CLK=1;delay_us(1); CLK=0;
address<<=1;
}
for(temp=16;temp!=0;temp--) // 写入16位的数据(一字节)
{
DI=InData&0x8000;
CLK=1;delay_us(1); CLK=0; //上升沿
InData<<=1; //InData=InData<<1;
}
CS=0; DO=1;
delay_us(1);
CS=1; CLK=1; //CS不片选芯片(为0)的时间要大于Tcsmin
while(DO==0)
{
CLK=0;delay_us(1); CLK=1; //如果繁忙状态,则CLK=0,CS=1
}
CLK=0; CS=0; // 结束
Ewds();
}
//读出93c46RAM
unsigned int read(unsigned char address)
{
u8 i;
u16 result;
Ewen();
CLK=0; DI=1; // 110 A5-A0
CS=0;delay_us(1); CS=1;
CLK=1;delay_us(1); CLK=0; // 先输入一个1
address=address&0x3f|0x80; // address变成10xxxxxx
for(i=8;i!=0;i--) // 接下来连续输入8位(在93C46中的地址 指令形式 110 A5-A0)
{ // 8
DI=address&0x80;
CLK=1;delay_us(1); CLK=0;
address<<=1;
}
DO=1;
for(i=16;i!=0;i--) //读取16位的数据(一字节)
{ // 16
CLK=1; //在下降沿输出数据到DO
result=(result<<1)|DO; //将数据按位存入result中
delay_us(1);
CLK=0;
}
CS=0;
Ewds();
return(result);
}