TA的每日心情 | 衰 2014-6-11 09:35 |
---|
签到天数: 15 天 连续签到: 1 天 [LV.4]偶尔看看III
|
最近起兴在调试硬件的通信接口,因为感觉硬件和软件模拟方式相比优点很明显,具体的不详说了,下面我上传一个百度上的文档,也是我在调试的时候遇到的一个问题,关于NSS端口电平的问题,我将硬件设置好后发现NSS端口一直是低电平,于是出现了无法连续转换数据的大问题。无奈之下百度之后找到原因,原来是单片机的原因啊……之后将NSS端口改为模拟方式控制,于是我我的程序是半硬件半模拟方式了,心碎啊,我也将核心程序贴- #include "stm32f4xx.h"
- /** SPI1 GPIO Configuration
- PA4 ------> SPI1_NSS
- PA5 ------> SPI1_SCK
- PA6 ------> SPI1_MISO
- PA7 ------> SPI1_MOSI
- */
- u8 SPIx_ReadWriteByte(u8 TxData);
- void spi_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- SPI_InitTypeDef SPI_InitStruct;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//spi1时钟使能
- //Enable SCK, MOSI, MISO and NSS GPIO clocks
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
- // GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- //!!! GPIO_Init is commented because some parameters are missing
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- //!!! GPIO_Init is commented because some parameters are missing
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- /*Configure GPIO pin alternate function */
- // GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1);
-
- /*Configure GPIO pin alternate function */
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
- /*Configure GPIO pin alternate function */
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
- /*Configure GPIO pin alternate function */
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
-
-
- SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//双向双线全双工
- SPI_InitStruct.SPI_Mode=SPI_Mode_Master;//主机模式
- SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//8帧数据结构
- SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;//时钟悬空高
- SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;//在第二个时钟捕获
- SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//软件控制CS
- SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//波特率分频256
- SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;//从高位开始
- SPI_InitStruct.SPI_CRCPolynomial = 7;//计算的多项式
- SPI_Init(SPI1,&SPI_InitStruct);
- SPI_Cmd(SPI1, ENABLE);
- SPIx_ReadWriteByte(0xff);
- }
- //SPIx 写入一个数据
- //TxData:要写入的字节
- //返回值:读取到的字节
- u8 SPIx_ReadWriteByte(u8 TxData)
- {
- u8 retry=0;
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)//发送缓存空标志位
- {
- retry++;
- if(retry>200)return 0;
- }
- SPI_I2S_SendData(SPI1, TxData); //通过外设SPI发送
- retry=0;
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//接收缓存空标志位
- {
- retry++;
- if(retry>200)return 0;
- }
- return SPI_I2S_ReceiveData(SPI1); //通过spi接收的数据
- }
复制代码 上来了,请大家拍砖!
|
|