stm32 SPI的一个问题,很奇怪,求大神指导

bai838052526 2013-03-22 07:07:36
自己做的板子,232,422调试成功之后调试SPI借口,ARM型号是stm32103FRET6,调试的时候如果发送的是char类型的字母或数字,在串口调试工具之中显示的跟发送的有错位,但是还能接受到,如发送SPI,接受的到的是(SPI,很不解,后来发送16进制数,发送0x1A,得到的完全不搭边,以下是调试的代码,求大神指导:
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#include "math.h"
#include "stm32f10x_spi.h"
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
void RCC_cfg(void);
void GPIO_cfg(void);
void USART_cfg(void);
void NVIC_cfg(void);
void SPI2_Config(void);
char fasong(char byte);
char jieshou(char byte);
u16 SPIx_ReadWriteByte(u16 TxData);
int main()
{
int j;
int i;
char bit[8]={0x1A};
char sbit[8];
GPIO_cfg();
RCC_cfg();
USART_cfg();
SPI2_Config();
fasong(bit[8]) ;
sbit[8]=jieshou(bit[8]);
USART_ClearFlag(USART3,USART_FLAG_TC);
for(j=0;j<10000;j++)
{
for(i=0;i<20;i++)
{
USART_SendData(USART3,sbit[i]);
//等待数据发送完毕
while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET)
{

}
Delay(0x3FFFF);
GPIO_SetBits(GPIOA, GPIO_Pin_6);
Delay(0x3FFFF);
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
}
}
}

//RCC时钟配置
void RCC_cfg(void)
{

//定义错误状态变量
ErrorStatus HSEStartUpStatus;
RCC_ClocksTypeDef RCC_Clocks1;
//将RCC寄存器重新设置为默认值
RCC_DeInit();
//打开外部高速时钟晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速时钟晶振工作
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
//设置AHB时钟(HCLK)等于系统时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1);

//设置高速AHB时钟(APB2)为HCLK时钟
RCC_PCLK2Config(RCC_HCLK_Div1);

//设置低速AHB时钟(APB1)为HCLK的2分频
RCC_PCLK1Config(RCC_HCLK_Div2);

//设置FLASH代码延时
FLASH_SetLatency(FLASH_Latency_2);

//使能预取指缓存
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//设置PLL时钟,为HSE的2分频后9倍频 8MHz * 9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

//使能PLL
RCC_PLLCmd(ENABLE);
//等待PLL准备就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//设置PLL为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//判断PLL是否是系统时钟
while(RCC_GetSYSCLKSource() != 0x08);
RCC_GetClocksFreq(&RCC_Clocks1);
}
//打开GPIO时钟,复用功能,串口1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1, ENABLE);
//打开GPIOB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//打开串口3的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
}
//IO口配置
void GPIO_cfg()
{

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//串口3配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//点亮LED灯
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
}
//串口初始化
void USART_cfg()
{
USART_InitTypeDef USART_InitStructure;
//将结构体设置为缺省状态
USART_StructInit(&USART_InitStructure);
//波特率设置为115200
USART_InitStructure.USART_BaudRate = 115200;
//一帧数据的宽度设置为8bits
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//在帧结尾传输1个停止位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//奇偶失能模式,无奇偶校验
USART_InitStructure.USART_Parity = USART_Parity_No;
//发送/接收使能
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//硬件流控制失能
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//设置串口3
USART_Init(USART3, &USART_InitStructure);
//打开串口1的中断响应函数,接收中断
// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//打开串口3
USART_Cmd(USART3, ENABLE);
}

//配置中断
void NVIC_cfg()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //选择中断分组2
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //选择串口2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
}

void SPI2_Config(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
SPI_Cmd(SPI2,DISABLE);
/* Configure SPI1 pins: SCK and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用输出
GPIO_Init(GPIOB, &GPIO_InitStructure);

//SPI1 NSS
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);
/* SPI configuration -------------------------------------------------------*/
//SPI_I2S_DeInit(SPI2);
//SPI_Cmd(SPI2, DISABLE);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CLK空闲时为电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_CRCPolynomial = 7; //crc7,stm32spi带硬件ecc
SPI_Init(SPI2, &SPI_InitStructure);
//SPI_TIModeCmd(SPI2, ENABLE);
SPI_Cmd(SPI2,ENABLE);
}

char jieshou(char byte)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, byte);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI2);
}

char fasong(char byte)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, byte);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
SPI_I2S_ReceiveData(SPI2);
}

...全文
1857 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
道亦无名 2014-08-09
  • 打赏
  • 举报
回复
void SPI2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE ); //SPI2时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | 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_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉 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(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 SPI_Cmd(SPI2, ENABLE); //使能SPI外设 SPI2_ReadWriteByte(0xff); //启动传输 }
zhujinqiang 2013-03-28
  • 打赏
  • 举报
回复
引用 14 楼 youzi722 的回复:
“自发自收”是将MISO和MOSI接一起了么,这样不行 因为这样MISO和MOSI上信号就是同时出现的(假设STM32-SPI做主),这样你在下面函数里就把MISO的数据收回来了 char fasong(char byte) { while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI2, byte); // 这里发送 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); SPI_I2S_ReceiveData(SPI2); // 这里接收,然后被抛弃掉了 } SPI虽然是全双工的,但由于是同步串口,只靠主机的时钟信号来启动收发过程,因此你发一个数,同时也收一个数 无论你是否想收数据。同样你想收一个数,也要发一个无效的数。 实际应用中,SPI都是按半双工使用的,做主的一方,发送一个数时,同时也收一个废数丢掉。收的时候,发一个废数,以启动时钟输出。而做从的一方,检测时钟,时钟有了,开始收数,如果有待发的数,同时把数据发出去。
++ 热心助人!
youzi722 2013-03-28
  • 打赏
  • 举报
回复
“自发自收”是将MISO和MOSI接一起了么,这样不行 因为这样MISO和MOSI上信号就是同时出现的(假设STM32-SPI做主),这样你在下面函数里就把MISO的数据收回来了 char fasong(char byte) { while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI2, byte); // 这里发送 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); SPI_I2S_ReceiveData(SPI2); // 这里接收,然后被抛弃掉了 } SPI虽然是全双工的,但由于是同步串口,只靠主机的时钟信号来启动收发过程,因此你发一个数,同时也收一个数 无论你是否想收数据。同样你想收一个数,也要发一个无效的数。 实际应用中,SPI都是按半双工使用的,做主的一方,发送一个数时,同时也收一个废数丢掉。收的时候,发一个废数,以启动时钟输出。而做从的一方,检测时钟,时钟有了,开始收数,如果有待发的数,同时把数据发出去。
bai838052526 2013-03-28
  • 打赏
  • 举报
回复
引用 12 楼 youzi722 的回复:
此外你这里配置为16bits了而实际你是按字节操作的 SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; 给你个参考的例子吧,访问spi-flash的程序 #define SPINOR_CS_H GPIOA->BSRR=GPIO_Pin_4 #define SPINOR_CS_L GPIOA->BRR=GPIO_Pin_4 //================================================================================================== // SPI-FLASH收发数据函数 //================================================================================================== unsigned char spinor_rtx_byte(unsigned char data) { while((SPI1->SR & SPI_I2S_FLAG_TXE) == RESET); SPI1->DR = data; while((SPI1->SR & SPI_I2S_FLAG_RXNE) == RESET); return SPI1->DR; } //================================================================================================== // 使能FLASH写操作 //================================================================================================== void spinor_write_enable(void) { SPINOR_CS_L; spinor_rtx_byte(SPINOR_WRITE_ENABLE); SPINOR_CS_H; } //================================================================================================== // 禁止FLASH写操作 //================================================================================================== void spinor_write_disable(void) { SPINOR_CS_L; spinor_rtx_byte(SPINOR_WRITE_DISABLE); SPINOR_CS_H; } //================================================================================================== // 在连续编程期间禁止SO输出busy信号 //================================================================================================== void spinor_write_dbusy(void) { SPINOR_CS_L; spinor_rtx_byte(SPINOR_DISABLE_SO); SPINOR_CS_H; } //================================================================================================== // 写状态寄存器 //================================================================================================== void spinor_write_status(unsigned char state) { volatile unsigned int delay; SPINOR_CS_L; spinor_rtx_byte(SPINOR_ENABLE_WSTATUS); SPINOR_CS_H; for(delay=0; delay<8; delay++); SPINOR_CS_L; spinor_rtx_byte(SPINOR_WRITE_STATUS); spinor_rtx_byte(state); SPINOR_CS_H; } //================================================================================================== // 读状态寄存器 //================================================================================================== unsigned char spinor_read_status(void) { unsigned char status; SPINOR_CS_L; spinor_rtx_byte(SPINOR_READ_STATUS); status = spinor_rtx_byte(SPINOR_DUMMY_BYTE); SPINOR_CS_H; return status; } //================================================================================================== // 等待写结束 //================================================================================================== void spinor_wait_free(void) { unsigned char status; unsigned int timeout; timeout = 100000; SPINOR_CS_L; spinor_rtx_byte(SPINOR_READ_STATUS); do { status = spinor_rtx_byte(SPINOR_DUMMY_BYTE); timeout--; }while(((status & 0x01) == SET) && timeout); SPINOR_CS_H; } //================================================================================================== // SPI FLASH初始化 //================================================================================================== void spinor_init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE); // 配置SPI1引脚: NSS, SCK, MISO and MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置PA4为片选信号 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); SPINOR_CS_H; // SPI配置 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); // 使能SPI1 SPI_Cmd(SPI1, ENABLE); spinor_write_dbusy(); } //================================================================================================== // SPI FLASH扇区擦除 //================================================================================================== void spinor_sector_erase(unsigned int addr) { // 如需保护某些段,在使能前写状态寄存器 spinor_write_enable(); SPINOR_CS_L; spinor_rtx_byte(SPINOR_SECTOR_ERASE); spinor_rtx_byte((unsigned char)(addr>>16)); spinor_rtx_byte((unsigned char)(addr>>8)); spinor_rtx_byte((unsigned char)addr); SPINOR_CS_H; spinor_wait_free(); spinor_write_disable(); }
我是这么调试的,不接外围设备,自发自收,这样可以吗?
youzi722 2013-03-27
  • 打赏
  • 举报
回复
此外你这里配置为16bits了而实际你是按字节操作的 SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; 给你个参考的例子吧,访问spi-flash的程序 #define SPINOR_CS_H GPIOA->BSRR=GPIO_Pin_4 #define SPINOR_CS_L GPIOA->BRR=GPIO_Pin_4 //================================================================================================== // SPI-FLASH收发数据函数 //================================================================================================== unsigned char spinor_rtx_byte(unsigned char data) { while((SPI1->SR & SPI_I2S_FLAG_TXE) == RESET); SPI1->DR = data; while((SPI1->SR & SPI_I2S_FLAG_RXNE) == RESET); return SPI1->DR; } //================================================================================================== // 使能FLASH写操作 //================================================================================================== void spinor_write_enable(void) { SPINOR_CS_L; spinor_rtx_byte(SPINOR_WRITE_ENABLE); SPINOR_CS_H; } //================================================================================================== // 禁止FLASH写操作 //================================================================================================== void spinor_write_disable(void) { SPINOR_CS_L; spinor_rtx_byte(SPINOR_WRITE_DISABLE); SPINOR_CS_H; } //================================================================================================== // 在连续编程期间禁止SO输出busy信号 //================================================================================================== void spinor_write_dbusy(void) { SPINOR_CS_L; spinor_rtx_byte(SPINOR_DISABLE_SO); SPINOR_CS_H; } //================================================================================================== // 写状态寄存器 //================================================================================================== void spinor_write_status(unsigned char state) { volatile unsigned int delay; SPINOR_CS_L; spinor_rtx_byte(SPINOR_ENABLE_WSTATUS); SPINOR_CS_H; for(delay=0; delay<8; delay++); SPINOR_CS_L; spinor_rtx_byte(SPINOR_WRITE_STATUS); spinor_rtx_byte(state); SPINOR_CS_H; } //================================================================================================== // 读状态寄存器 //================================================================================================== unsigned char spinor_read_status(void) { unsigned char status; SPINOR_CS_L; spinor_rtx_byte(SPINOR_READ_STATUS); status = spinor_rtx_byte(SPINOR_DUMMY_BYTE); SPINOR_CS_H; return status; } //================================================================================================== // 等待写结束 //================================================================================================== void spinor_wait_free(void) { unsigned char status; unsigned int timeout; timeout = 100000; SPINOR_CS_L; spinor_rtx_byte(SPINOR_READ_STATUS); do { status = spinor_rtx_byte(SPINOR_DUMMY_BYTE); timeout--; }while(((status & 0x01) == SET) && timeout); SPINOR_CS_H; } //================================================================================================== // SPI FLASH初始化 //================================================================================================== void spinor_init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE); // 配置SPI1引脚: NSS, SCK, MISO and MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置PA4为片选信号 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); SPINOR_CS_H; // SPI配置 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); // 使能SPI1 SPI_Cmd(SPI1, ENABLE); spinor_write_dbusy(); } //================================================================================================== // SPI FLASH扇区擦除 //================================================================================================== void spinor_sector_erase(unsigned int addr) { // 如需保护某些段,在使能前写状态寄存器 spinor_write_enable(); SPINOR_CS_L; spinor_rtx_byte(SPINOR_SECTOR_ERASE); spinor_rtx_byte((unsigned char)(addr>>16)); spinor_rtx_byte((unsigned char)(addr>>8)); spinor_rtx_byte((unsigned char)addr); SPINOR_CS_H; spinor_wait_free(); spinor_write_disable(); }
youzi722 2013-03-27
  • 打赏
  • 举报
回复
那就仿真一下么,看看调用fasong()时传进去的参数,再看看jieshou()返回的数据时什么 另外,你STM32的SPI上接的是什么设备,怎么保证发出去的能收回来呢,两个STM32 SPI互联么
bai838052526 2013-03-27
  • 打赏
  • 举报
回复
引用 9 楼 youzi722 的回复:
LZ,捏的程序有问题,还没看出来么 char bit[8]={0x1A}; 是定义包含8个char类型参数的数组,bit[0]赋值为0x1a,bit[1]-bit[7]为0 char sbit[8]; 未赋值 fasong(bit[8]); 哪有bit[8]啊,最大bit[7]越界了 sbit[8]=jiesho……
你说的有道理,但是我按照您给的意见去该,发现没什么实质性进展,问题依旧啊
youzi722 2013-03-27
  • 打赏
  • 举报
回复
LZ,捏的程序有问题,还没看出来么 char bit[8]={0x1A}; 是定义包含8个char类型参数的数组,bit[0]赋值为0x1a,bit[1]-bit[7]为0 char sbit[8]; 未赋值 fasong(bit[8]); 哪有bit[8]啊,最大bit[7]越界了 sbit[8]=jieshou(bit[8]);同样 .... for(i=0;i<20;i++) sbit[i]都到19了,不知道越到哪去了 { USART_SendData(USART3,sbit[i]); .... }
bai838052526 2013-03-26
  • 打赏
  • 举报
回复
那个函数都没用到
Simality 2013-03-26
  • 打赏
  • 举报
回复
没细看代码。你查查时钟极性和边沿有没有设置错。
青衫含笑默 2013-03-25
  • 打赏
  • 举报
回复
char fasong(char byte); char jieshou(char byte); u16 SPIx_ReadWriteByte(u16 TxData); 你发送的是char 接收的是u16
bai838052526 2013-03-25
  • 打赏
  • 举报
回复
我试试软件仿真看一下
youzi722 2013-03-25
  • 打赏
  • 举报
回复
别的还没看懂,不过你这定义的是嘛呀, C语言啊啊啊 char bit[8]={0x1A}; char sbit[8]; ... fasong(bit[8]) ; sbit[8]=jieshou(bit[8]); .... for(i=0;i<20;i++) { USART_SendData(USART3,sbit[i]); .... }
woshi_ziyu 2013-03-25
  • 打赏
  • 举报
回复
用软件仿真一下 看看串口设置
bai838052526 2013-03-25
  • 打赏
  • 举报
回复
怎么样,会吗?可以追加给分,200分都行
dragon_cheng 2013-03-24
  • 打赏
  • 举报
回复
这问题

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧