STM32/STM8技术william hill官网
直播中

周颖雯

7年用户 153经验值
私信 关注
[问答]

STM32F051R8硬件SPI如何送命令呢?

請問各位高手,目前使用SPI1控制93C46(128X8)但是控制命令+address共10BIT我該如何送命令呢?STM32f051r8  pa5:sck, pa6:miso, pa7:mosi, pa4:cs  

start bit=1   op code=10  A6 A5 A4 A3 A2 A1 A0 --> (read)
read: 1100000000 先送出(0xC0)再送(0x00)對嗎?還是先送(0X03)再送(0X00)?


SPI_DataSize_10b對嗎?還是要設成SPI_DataSize_8b?
麻煩各位高手指點一下小弟....

void SPI_INIT(void)
{
  SPI_InitTypeDef SPI_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);      
          
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_10b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;  
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
        
  SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
  SPI_SSOutputCmd(SPI1, ENABLE);
  SPI_Cmd(SPI1,ENABLE);

}

回帖(14)

蔡彦壁

2018-9-7 09:37:31
设置成SPI_DataSize_10b模式,10位拆分位两个字节,先送(0X03)再送(0X00),你试下就可以了
举报

周颖雯

2018-9-7 09:48:29
引用: 报纸弟弟麦花 发表于 2018-9-7 07:00
设置成SPI_DataSize_10b模式,10位拆分位两个字节,先送(0X03)再送(0X00),你试下就可以了

好的我試看看.....
举报

周颖雯

2018-9-7 10:04:26
引用: 报纸弟弟麦花 发表于 2018-9-7 07:00
设置成SPI_DataSize_10b模式,10位拆分位两个字节,先送(0X03)再送(0X00),你试下就可以了

我先送0x03那前面都是0 (00000011),這樣93c46的start bit 1可以被判斷出來嗎?我試過先送0x03,0x00還是不行耶....
举报

段宜敏

2018-9-7 10:22:34
那就SPI_DataSize_16b,直接发两个字节!
举报

周颖雯

2018-9-7 10:39:50
引用: redsworm 发表于 2018-9-7 07:45
那就SPI_DataSize_16b,直接发两个字节!

你是說直接送(0xC000)還是(0x0300)?可是命令+address共10bit那多出來的如何處理呢?
datasheet上說明read : 1 10 a6 a5 a4 a3 a2 a1 a0--->?該如何送?
举报

袁富存

2018-9-7 10:54:18
引用: 60user116 发表于 2018-9-7 08:02
你是說直接送(0xC000)還是(0x0300)?可是命令+address共10bit那多出來的如何處理呢?
datasheet上說明read : 1 10 a6 a5 a4 a3 a2 a1 a0--->?該如何送?

datasheet上說明read : 1 10 a6 a5 a4 a3 a2 a1 a0数据手册上怎么没查到
举报

袁富存

2018-9-7 11:08:12
引用: 冬冬5241 发表于 2018-9-7 08:17
datasheet上說明read : 1 10 a6 a5 a4 a3 a2 a1 a0数据手册上怎么没查到

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

//配置SPI2管脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);
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);

//SPI2配置选项
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);
   
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_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);

//使能SPI2
SPI_Cmd(SPI2, ENABLE);  
}
举报

蔡彦壁

2018-9-7 11:24:12
有逻辑分析仪吗?看下通讯波形对不对。还是不行就直接IO 模拟spi,一定可以,程序好多现成的
举报

王健

2018-9-7 11:38:47
先看一下你的管脚配连接是否正确,再用示波器观察一下波形,先发0X03再发0X00
举报

周颖雯

2018-9-7 11:49:04
引用: kghfh 发表于 2018-9-7 09:01
先看一下你的管脚配连接是否正确,再用示波器观察一下波形,先发0X03再发0X00

void PORT_INIT(void)
{


  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOC, ENABLE);      
   

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);     
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);     
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);

       
       
  
/* Configure SPI1 PA5:SCK PA6:MISO PA7:MOSI------------------*/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
       
       
/* Configure PA6:MISO ------------------*/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;              
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;            
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  





uint8_t SPI1_ReadWriteByte(uint8_t TxData)                                       
{
            
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_SendData8(SPI1, TxData);

        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
        return SPI_ReceiveData8(SPI1);

}

93C46 命令+address不是剛好8bit 那SPI_datasize_8b這一句是否要改成SPI_datasize_9b ?
是不是SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF)這裡有問題?
網上找的都是SPI模擬居多, 我打算用的是硬件SPI,多謝各位高手的指點....
举报

周颖雯

2018-9-7 11:59:24
引用: 60user116 发表于 2018-9-7 09:12
void PORT_INIT(void)
{

write功能試出來了...謝謝各位樓上高手的指點有幫助到...

唯一疑惑的是93c46數據格式9bit或10bit兩種 ...我用9bit格式寫入eeprom成功
但是spi數據是設定成spi_datasize_8b方式,而不是我原先認為應該設成spi_datasize_9b  (或10b)

stm32f0 可以設成spi_datasieze範圍4b---16b,這樣的方式不就是方便針對不同數據長度的外設spi設成不同的數據格式長度嗎?怎麼我設成spi_datasize_8b也可以成功...?
举报

黄晔华

2018-9-7 12:10:35
SPI_DataSize_8b 吧
举报

毛玲燕

2018-9-7 12:24:11
帮顶!!!
举报

alonggege

2019-7-20 14:32:56
不错,很好的经验分享,辛苦麻烦了,欠缺这方面的资料,非常感谢。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分