本人小白一個,剛開始弄MCU。想用stm32f407 SPI3驅動TMC5160。目前發現問題是SPI讀回來的一直是0,即使不接TMC5160讀回來的都是0。用示波器看CLK16已經起振了,SCK回傳頻率不對,想請教各位大神這是什么問題。
配置代碼如下:
void SPI23_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //使能GPIOB時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); //使能SPI3時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //SCK
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //上拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //MISO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //上拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //上拉
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_SPI3); //PC10復用為 SPI3
GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_SPI3); //PC11復用為 SPI3
GPIO_PinAFConfig(GPIOC,GPIO_PinSource13,GPIO_AF_SPI3); //PC12復用為 SPI3
//SPI口初始化
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_32;//定義波特率預分頻的值:波特率預分頻值為256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB; //指定資料傳輸從MSB位還是LSB位開始:資料傳輸從MSB位開始
SPI_InitStructure.SPI_CRCPolynomial = 0; //CRC值計算的多項式
SPI_Init(SPI3, &SPI_InitStructure); //根據SPI_InitStruct中指定的引數初始化外設SPIx暫存器
SPI_Cmd(SPI3, ENABLE); //使能SPI外設
SPI3_ReadWriteByte(0xff); //啟動傳輸
}
u8 SPI3_ReadWriteByte(u8 writeData)
{
u8 waitnum=0,i=0;
while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET)//等待發送區空
{
waitnum++;
if(waitnum>200) return 0;
}
SPI_I2S_SendData(SPI3, writeData); //通過外設SPI3發送一個位元組
waitnum=0;
while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)//等待一個位元組接收完
{
waitnum++;
if(waitnum>200)return 0;
}
return SPI_I2S_ReceiveData(SPI3); //回傳SPI3接收的資料
}
uj5u.com熱心網友回復:
自己頂一下,千萬別沉了。有沒有大神了解的uj5u.com熱心網友回復:
你先找個能正常讀寫的程式,讓TMC5160跑起來再看uj5u.com熱心網友回復:
沒有找到例程
uj5u.com熱心網友回復:
https://download.csdn.net/download/yishuicanhong/10350346uj5u.com熱心網友回復:
SPI這段應該沒有問題,你看下TMC5160的手冊,看看你這樣設定spi是否可行!另外spi的io口我初始化以后一般會拉高,不知道有沒有用!
uj5u.com熱心網友回復:
可以給我發郵件[email protected]我有例子代碼可以供您參考uj5u.com熱心網友回復:
spi與外設無關的,先調通spi。參考TMC262的:https://blog.csdn.net/qq_20553613/article/details/80210813
uj5u.com熱心網友回復:
可以發我一份嗎?謝謝哈我微信13588268763,有償,謝謝哈!uj5u.com熱心網友回復:
SPI很簡單,只是一個發送方和接收方連接成一個回圈的移位暫存器,在時鐘脈沖驅動下兩者互相交換資料;你讀不到資料檢查是片選信號是否連接正確,要讀的從機地址是否正確?
uj5u.com熱心網友回復:
你好樓主,現在我在ST32和TMC5160的使用上遇到了一些問題,因為是技術小白,所以一直沒有進展,可以把代碼發我一份參考一下嗎?我的郵箱 [email protected] ,謝謝!uj5u.com熱心網友回復:
有一塊TMC5160_BOB_v1.2的模塊,可以發給例子代碼嗎?[email protected]uj5u.com熱心網友回復:
請充分注意管腳,不要跟別的功能沖突,特別是注意是否使用了jtag管腳轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/17279.html
標籤:單片機/工控
上一篇:無線模塊生產、測驗流程!急求!
