初级会员

- 积分
- 78
- 金钱
- 78
- 注册时间
- 2015-5-21
- 在线时间
- 14 小时
|
u32 SPI_ATT_Read(u8 address) //返回值的低24位有效
{
char i;
u32 temp_data;
temp_data = 0;
SPI_CLK = 0; //CLK 初始状态是 0
SPI_CS = 0;
SPI_CLK = 1; //启动数据传输
SPI_DIN = 0; //0 表示主机向从机读数据
SPI_CLK = 0; //从机需要在下降沿取数据
for(i=6; i>=0; i--)
{
SPI_CLK = 1; //启动数据传输
SPI_DIN = (address & (0x01<<i))>>(i);//地址从 0x00 到 0x7F
SPI_CLK = 0; //从机需要在下降沿取数据
}
//无关语句省略
}
昨天调SPI的读函数,因为硬件老搞不定,就试试用软件摸拟,上面的官方手册的例程,结果调试时总死机,跟踪发现一直在for(i=6; i>=0; i--){}循环里出不来,发现i的值减到0后会变成0XFF,于是条件满足,一直循环,按一般理解,i是有符号的,减到0后再减1应是-1,应会结束循环,当时没时间深究,但感觉应该是编译器的问题,工程是用原子的例程直接改的,编译器选项都没动,今天仔细研究了一下,编译器的C/C++选项里有一条“Plain Char is Signed" 没有选中,这个选项字面意思应该是“默认的字符是有符号的”,把这个选项选中,再调试就可以正常退出循环了。 |
|