国产 MCU AT32F403A 替换 STM32F103 spi flash读写测试

第八章AT32F403A替换stm32f103 spi flash读写测试

前言

        此文章是使用AT32F403A的开发板去跑stm32f103spi flash读写代码的测试情况

硬件

      硬件方面使用的是自己画的板子,使用的AT32F403ARCT7,外设方面有USART2USART3CAN1CAN2SPIIICUSBSDIOUSART2/3接的是SP3485EN的芯片;CAN的收发芯片都是SIT1050(芯力特国产品牌,可替换tja1050);SPI的是接了一颗W25Q12816M的容量;IIC接的是一颗AT24C04SDIO可插SD卡。仿真口以及串口1则使用的ATLINK的接口定义,直接使用ATLINK插上即可。USART2USART3485芯片,可以通过跳线帽对接起来;CAN1CAN2也是一样。

        

软件

        测试使用的软件是stm32f103的3.5标准库的工程代码。想快速验证的可以下正点、野火等的代码回来再根据自己外设的硬件的设计稍微修改就可以进行测试,就是库是stm32F103的3.5标准库的。

软件相关部分:

        直接使用的stm32的spi flash的读写驱动,硬件上w25q接的是spi1的接口,所以代码上要使用spi1的接口。

相关代码如下:        

   

void SPI1_Init(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;

	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA, ENABLE );
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_SPI1,  ENABLE );
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

 	GPIO_SetBits(GPIOA,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);  

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//设置SPI工作模式:设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//设置SPI的数据大小:SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;		//串行同步时钟的空闲状态为高电平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;	//串行同步时钟的第二个跳变沿(上升或下降)数据被采样
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式
	SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
	SPI_Cmd(SPI1, ENABLE); //使能SPI外设
	
	SPI1_ReadWriteByte(0xff);//启动传输		 
}

u8 SPI1_ReadWriteByte(u8 TxData)
{		
	u8 retry=0;				 	
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
		{
		retry++;
		if(retry>200)return 0;
		}			  
	SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
	retry=0;

	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
		{
		retry++;
		if(retry>200)return 0;
		}	  						    
	return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据					    
}

const u8 writebuf[]={"AT32F403A 替换SXX32f103 spi flash测试 写入数据!!"};
#define len sizeof(writebuf)
 int main(void)
 {	 
	u16 i=0;
	u8 readbuf[len]; 
	 
	delay_init();	    	   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	uart1_init(115200);	 	
	AT32LED_Init();		  			 	 	
	W25QXX_Init();			
	printf ("AT32F403A 替换SXX32f103 spi flash测试!!\r\n");
	
	if(W25QXX_ReadID()!=W25Q128)								
	{		
		printf("W25Q128 read  id failed");	
	}else
	{
		printf ("W25QXX_ReadID:%02x \r\n",W25QXX_ReadID());	
	}
	printf ("write data:\r\n%s \r\n",writebuf );
	W25QXX_Write((u8*)writebuf,0,len);			
	W25QXX_Read(readbuf,0,len);					
	printf ("read data:\r\n%s \r\n",readbuf );
	  
	while(1)
	{		
		i++;
		delay_ms(10);
		if(i==50)
		{
			LED3=!LED3;//提示系统正在运行	
			i=0;
		}		   
	}
} 

测试结果

       通过看串口助手的log,程序已经运行起来,读出的值和我们写入的值是一样的:

总结

        从测试来看,AT32F403A是可以直接的跑stm32f103spi flash读写的代码,在使用上一致。

本文仅供于学习、测试使用。

有什么问题的可加qq群技术交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值