您好!
此程序在内部将 TX 循环到 Rx 。 我收到的内容与我发送的内容无关。 为什么?
#include
uint8_t SEND = 0x00;
uint8_t myrxd = 0x00;
void ReadSPI (void){
while (((SSI2->SR &(1<<2)=0);//wiat 为空
myrxd = SSI2->DR;
}
void writeSPI (uint8_t data){
SSI2 -> DR =数据;
while (((SSI2 -> SR &(1 << 4))= 1);//等待忙
}
int main()
{
//15.4初始化和配置
//1. 使用 RCGCSSI 寄存器(见346页)使能 SSI 模块。
SYSCTL -> RCGCSSI |=(1 <<2);// SSI2
//2. 通过 RCGCGPIO 寄存器(见第340页)使能相应 GPIO 模块的时钟。
SYSCTL -> RCGCGPIO |=(1 << 1);//端口 B
//3. 将相应管脚的 AFSEL 位置位(见671页)。 以确定要使用哪些 GPIO
GPIOB ->AFSEL |=(1 <<4)|(1<<5)|(1<<6)|(1 <<7);// PB4-PB7 SSI 引脚
GPIOB ->PUR |=(1 <<4)|(1<<5)|(1<<6)|(1 <<7);//启用上拉
//4. 配置 GPIOPCTL 寄存器中的 PMCn 域、将 SSI 信号分配给相应的
//引脚。 见第688页和第1351页的表23-5。
GPIOB -> PCTL |=(2<< 16)|(2<<20)|(2<< 24)|(2<<<28);//PMC 4/5/6/7
//5. 对 GPIODEN 寄存器进行编程以启用管脚的数字功能。 此外、驱动强度
GPIOB -> DEN |=(1 << 4)|(1<<5)|(1<<6)|(1<<7);
//对于每个帧格式、SSI 使用以下步骤进行配置:
//1. 在对配置进行任何更改之前、应确保 SSICR1寄存器的 SSE 位清零。
SSI2 -> CR1 &&μ~(1<<1);
//2. 选择 SSI 是主机还是从机:
SSI2 -> CR1 = 0x00000000;
SSI2 -> CR1 |=(1<0);//内部环路 TX-RX
//3. 通过写 SSICC 寄存器来配置 SSI 时钟源。
SSI2 -> CC = 0x00;//sys 时钟
//4. 通过写 SSICPSR 寄存器配置时钟预分频除数。
SSI2 -> CPSR = 0x10;
//5. 向 SSICR0寄存器写入以下配置:
SSI2 -> CR0 =(0x7<0);//0x0007
//6. 或者、按照以下步骤配置 SSI 模块的 μ µDMA 使用:
//7. 将 SSICR1寄存器的 SSE 位置位、使能 SSI 模块。
SSI2 -> CR1 |=(1<<1);//启用 SSI
while (1)
{
writeSPI (send++);
对于(int x=0;x <10;x++){
对于(int i=0;i < 100000;i++);
}
ReadSPI();
for (int i=0;i < 1;i++); //休息
}
返回0;
}