K60 用spi写MicroSD卡,FAT32的文件系统
简洁的spi收发指令该如何写?下面是我写的,求火哥,老高等高手修改(PS:receiveByte的函数我弄不明白怎么写,感觉SD卡没有响应,真心求解释啊。。void SPI_SendByte(u8 transmit_data){
u8 temp;
temp = transmit_data;
SPI_SR_REG(SPI0_BASE_PTR) = (SPI_SR_EOQF_MASK //clear the bit end of queue
| SPI_SR_TFUF_MASK //clear the bit overflow
| SPI_SR_TFFF_MASK //clear the bit fill
| SPI_SR_RFOF_MASK //clear the bit overflow
| SPI_SR_RFDF_MASK); //clear the bit drain
SPI_MCR_REG(SPI0_BASE_PTR) |= SPI_MCR_CLR_TXF_MASK //clear the TX FIFO
|SPI_MCR_CLR_RXF_MASK; //clear the RX FIFO
SPI_PUSHR_REG(SPI0_BASE_PTR) = 0
| SPI_PUSHR_CTAS(0) //CTAR0
| SPI_PUSHR_EOQ_MASK //last data
| SPI_PUSHR_TXDATA(temp);//transfer
while((SPI_SR_REG(SPI0_BASE_PTR) & SPI_SR_TCF_MASK)==0);
SPI_SR_REG(SPI0_BASE_PTR)=1<<31;
}
你好,我现在也在研究k60的SD卡开发,用的也是SPI,但是我的SD卡初始化一直不能进入idle模式,下面是我的SPI初始化部分程序,能不能帮我看下有什么问题,或者给我提供一些建议,不胜感激。void spi_init(uint8_t spino, uint8_t master)
{
SPI_MemMapPtr base_addr = spi_get_base_address(spino);
/* 使能SPI模块时钟,配置SPI引脚功能 */
if(SPI_MOD_SET(spino) == SPI0)
{
SIM_SCGC6 |= SIM_SCGC6_DSPI0_MASK;
/* PORT_PCR_MUX(0x2) : SPI功能
* PORT_PCR_DSE_MASK : Drive Strength Enable */
gpio_init(0, 13, OUT_PUT, 1); /* PCS0 */
PORTA_PCR15 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* SCK */
PORTA_PCR16 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* SOUT */
PORTA_PCR17 = 0 | PORT_PCR_MUX(0x2); /* SIN */
}
else if(SPI_MOD_SET(spino) == SPI1)
{
SIM_SCGC6 |= SIM_SCGC6_SPI1_MASK;
PORTE_PCR4 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* PCS0 */
PORTE_PCR2 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* SCK */
PORTE_PCR1 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* SOUT */
PORTE_PCR3 = 0 | PORT_PCR_MUX(0x2); /* SIN */
}
else
{
SIM_SCGC3 |= SIM_SCGC3_SPI2_MASK;
}
SPI_MCR_REG(base_addr) = 0
| SPI_MCR_CLR_TXF_MASK /* Clear the Tx FIFO counter. */
| SPI_MCR_CLR_RXF_MASK /* Clear the Rx FIFO counter. */
| SPI_MCR_PCSIS_MASK /* Peripheral Chip Select x Inactive State */
| SPI_MCR_HALT_MASK; /* Starts and stops DSPI transfers */
/* 根据主从机模式设置工作模式 */
if(master == MASTER)
{
SPI_MCR_REG(base_addr) |= SPI_MCR_MSTR_MASK; /* Master/Slave Mode Select */
SPI_CTAR_REG(base_addr,0) = 0
| SPI_CTAR_DBR_MASK /* Double Baud Rate */
| SPI_CTAR_FMSZ(0x08) /* Frame Size */
| SPI_CTAR_PDT_MASK /* 延时因子为7 */
| SPI_CTAR_BR(0x8) /* Selects the scaler value for the baud rate.*/
| SPI_CTAR_CPOL_MASK /* Clock Polarity:The inactive state value of SCK is high */
| SPI_CTAR_CPHA_MASK; /* Clock Phase:Data is changed on the leading edge of SCK*/
}
else
{
SPI_CTAR_SLAVE_REG(base_addr,0) = 0
| SPI_CTAR_SLAVE_FMSZ(0x08)
| SPI_CTAR_SLAVE_CPOL_MASK
| SPI_CTAR_SLAVE_CPHA_MASK;
}
SPI_SR_REG(base_addr) = (SPI_SR_EOQF_MASK /* End of Queue Flag */
| SPI_SR_TFUF_MASK /* Transmit FIFO Underflow Flag */
| SPI_SR_TFFF_MASK /* Transmit FIFO Fill Flag */
| SPI_SR_RFOF_MASK /* Receive FIFO Overflow Flag */
| SPI_SR_RFDF_MASK); /* Receive FIFO Drain Flag */
SPI_MCR_REG(base_addr) &= ~SPI_MCR_HALT_MASK; /* start */
} 购买了野火的K60了?不是已经提供了SDHC的例程了吗?跑文件系统了 hcx31 发表于 2012-5-5 16:23 static/image/common/back.gif
你好,我现在也在研究k60的SD卡开发,用的也是SPI,但是我的SD卡初始化一直不能进入idle模式,下面是我的SP ...
第42行: | SPI_CTAR_FMSZ(0x08) /* Frame Size */
通信的方式,是8位通信吧?这里修改成 0x07…… 应该是 SPI 的初始化有问题……苏大提供的例子,有个误导人的地方。
第42行: | SPI_CTAR_FMSZ(0x08) /* Frame Size */
这里修改成0x07 ,而不是0x08 山外メ雲ジ 发表于 2012-5-5 20:51 static/image/common/back.gif
购买了野火的K60了?不是已经提供了SDHC的例程了吗?跑文件系统了
我们是自己做的板子,没有用SDHC,用的是SPI 山外メ雲ジ 发表于 2012-5-5 20:55 static/image/common/back.gif
应该是 SPI 的初始化有问题……苏大提供的例子,有个误导人的地方。
第42行: | SP ...
恩,看了芯片资料,这里确实应该是0x07,可是改过之后还是没有相应~~郁闷了 库函数里面没有SPI啊 fatfs的官网有STM32F4的程序,可以下来参考下
页:
[1]