完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
spi初始化
#include "main.h" #include "uart.h" #include "DataType.h" #include "rcc.h" #include "spi.h" //SPI口初始化 //这里针是对SPI1的初始化 uint8_t Master_Temp=0; void SPI1_Init(void) { RCC->APB2ENR|=1<<0; //复用 RCC->APB2ENR|=1<<2; //PORTA时钟使能 RCC->APB2ENR|=1<<12; //SPI1时钟使能 //这里只针对SPI口初始化 GPIOA->CRL&=0X000FFFFF; GPIOA->CRL|=0XBBB00000;//PA5.6.7复用 GPIOA->ODR|=0X7<<5; //PA5.6.7上拉 SPI1->CR1|=0<<10;//全双工模式 SPI1->CR1|=1<<9; //软件nss管理 SPI1->CR1|=0<<8; SPI1->CR1|=0<<2; //SPI从机 SPI1->CR1|=0<<11;//8bit数据格式 SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1 SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1 SPI1->CR1|=0<<3; //Fsck=Fcpu/256 SPI1->CR1|=0<<7; //MSBfirst SPI1->CR2|=0<<6; //接收缓冲区非空中断使能 SPI1->CR1|=1<<6; //SPI设备使能 } //SPI 速度设置函数 //SpeedSet: //SPI_SPEED_2 2分频 (SPI 12M --sys 24M) //SPI_SPEED_8 8分频 (SPI 3M --sys 24M) //SPI_SPEED_16 16分频 (SPI 1.5M --sys 24M) //SPI_SPEED_256 256分频 (SPI 905.6K --sys 24M) void SPI1_SetSpeed(uint8_t SpeedSet) { SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256 if(SpeedSet==SPI_SPEED_2)//二分频 { SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz }else if(SpeedSet==SPI_SPEED_8)//八分频 { SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz }else if(SpeedSet==SPI_SPEED_16)//十六分频 { SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz }else //256分频 { SPI1->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式 } SPI1->CR1|=1<<6; //SPI设备使能 } //SPIx 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 uint8_t SPI1_ReadWriteByte(uint8_t TxData) { uint8_t retry=0; while((SPI1->SR&1<<1)==0)//等待发送区空 { retry++; if(retry>200)return 0; } SPI1->DR=TxData; //发送一个byte retry=0; while((SPI1->SR&1<<0)==0) //等待接收完一个byte { retry++; if(retry>200)return 0; } return SPI1->DR; //返回收到的数据 } uint8_t SPI1_ReadByte(void) { uint8_t retry=0; if((SPI1->SR&1<<1)==0)//等待发送区空 { while((SPI1->SR&1<<0)==0) //等待接收完一个byte { retry++; if(retry>200)return 0; } return SPI1->DR; //返回收到的数据 } return SPI1->DR; } 主函数 #include "main.h" #include "rcc.h" #include #include "uart.h" #include "DataType.h" #include "spi.h" LED_init()//LED初始化 { RCC->APB2ENR |= RCC_APB2Periph_GPIOF; /* 使能APB2总线的时钟,对GPIO的端口F时钟使能 */ GPIOF->CRL &= 0xF0FFFFFF; GPIOF->CRL |= 0x03000000; } void Delay(vu32 nCount) //通过不断for循环nCount次,达到延时的目的口 { int i=0; for (i=0; i<100000; i++) { for(; nCount != 0; nCount--); } } int main(void) //main是程序入口 { uint8_t ch_rd_spi2; RCC_init(); //时钟频率的配置 LED_init(); //LED初始化配置 uart_init(); //串口接口初始化 SPI1_Init(); //SPI1初始化 SPI1_SetSpeed(SPI_SPEED_256);//SPI速度两分频 while (1) { if((SPI1->SR&1<<0)==1) { ch_rd_spi2 = SPI1_ReadByte(); SPI1_ReadWriteByte(0xaa); } if (ch_rd_spi2 == 0x00) { uart_tx_string("*"); Delay(1000); } else { uart_tx_string("n Get date form spi2----"); uart_tx_char((uint8_t)ch_rd_spi2); uart_tx_string("----n"); break; } } } |
|
相关推荐
1个回答
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
785 浏览 0 评论
使用stm32l451片子,对ad7606进行3通道100k采样值跳动问题?
1354 浏览 1 评论
STM32进行DMA数据转运,为什么只有A组最后一位数据被转运到B组去?
1805 浏览 2 评论
2100 浏览 3 评论
1690 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-2 02:44 , Processed in 0.661279 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191